├── api ├── python │ ├── __init__.py │ ├── top_mail_ru.py │ └── test-top_mail_ru.py └── php │ ├── test-top_mail_ru.php │ └── top_mail_ru.php ├── .gitignore └── README.md /api/python/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .idea/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Рейтинг@Mail.ru 2 | 3 | Минималистичные Python и PHP модули для работы с API [Рейтинг@Mail.ru](https://top.mail.ru). 4 | 5 | ## PHP 6 | * Модуль - api/php/top_mail_ru.php 7 | * Пример - api/php/test-top_mail_ru.php 8 | 9 | ## Python 10 | * Модуль - api/python/top_mail_ru.py 11 | * Пример - api/python/test-top_mail_ru.py 12 | 13 | ### Ссылки 14 | 15 | * [Рейтинг@Mail.ru](https://top.mail.ru) 16 | 17 | * [Получить API key](https://top.mail.ru/feedback) 18 | 19 | * [Регистрация сайта и управление](https://top.mail.ru/help/ru/api/main) 20 | 21 | * [Основные параметры](https://top.mail.ru/help/ru/api/params) 22 | 23 | * [Описание JSON ответов](https://top.mail.ru/help/ru/api/response) 24 | -------------------------------------------------------------------------------- /api/python/top_mail_ru.py: -------------------------------------------------------------------------------- 1 | import struct 2 | import urllib 3 | import urllib2 4 | import json 5 | import hashlib 6 | 7 | class TopMailRu(object): 8 | 9 | apikey = "" 10 | session = "" 11 | 12 | def __init__(self, apikey=''): 13 | self.apikey = apikey 14 | 15 | def request(self, path, args): 16 | url = 'https://top.mail.ru' + path + '?' + urllib.urlencode(args) 17 | try: 18 | resp = urllib2.urlopen(url) 19 | jr = json.loads(resp.read()) 20 | except IOError, e: 21 | if hasattr(e, 'reason'): 22 | print 'We failed to reach a server.' 23 | print 'Reason: ', e.reason 24 | elif hasattr(e, 'code'): 25 | print 'The server couldn\'t fulfill the request.' 26 | print 'Error code: ', e.code 27 | else: 28 | return jr 29 | 30 | def registerSite(self, args): 31 | args['apikey'] = self.apikey 32 | args['session'] = self.session 33 | return self.request('/json/add', args) 34 | 35 | def editSite(self, id, password, args): 36 | args['apikey'] = self.apikey 37 | args['session'] = self.session 38 | args['id'] = id 39 | args['password'] = password 40 | return self.request('/json/edit', args) 41 | 42 | def getCode(self, id, password, args): 43 | args['apikey'] = self.apikey 44 | args['session'] = self.session 45 | args['id'] = id 46 | args['password'] = password 47 | return self.request('/json/code', args) 48 | 49 | def getStat(self, id, password, type, args): 50 | args['apikey'] = self.apikey 51 | args['session'] = self.session 52 | args['id'] = id 53 | args['password'] = password 54 | return self.request('/json/'+type, args) 55 | 56 | def setSession(self, session): 57 | self.session = session 58 | 59 | def login(self, id, password): 60 | args = { 'id': id, 'password': password, 'action': 'json' } 61 | args['apikey'] = self.apikey 62 | args['session'] = self.session 63 | res = self.request('/json/login', args) 64 | if res.get('session'): 65 | self.session = res['session'] 66 | return res.get('logged') == 'yes' 67 | 68 | -------------------------------------------------------------------------------- /api/python/test-top_mail_ru.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import sys 5 | from pprint import pprint 6 | 7 | # Подключаем top.mail.ru 8 | from top_mail_ru import TopMailRu 9 | 10 | EMAIL='__MY__EMAIL__' 11 | PASSWORD='__MY__PASSWORD__' 12 | MY_SITE='http://__MY__SITE__NAME__' 13 | # Ключ к API, требуется ТОЛЬКО для регистрации сайтов. 14 | # Для получения ключа напишите нам на https://top.mail.ru/feedback 15 | # В других случаях __API__KEY__ удалите и API_KEY оставьте пустым. 16 | # см. https://top.mail.ru/help/ru/api/main 17 | API_KEY='__API__KEY__' 18 | 19 | # 1-й аргумент - API key 20 | tmr = TopMailRu(API_KEY) 21 | 22 | # registerSite() - Регистрация сайта 23 | # см. https://top.mail.ru/help/ru/api/main - Регистрация сайта и управление 24 | result = tmr.registerSite({ 25 | 'title' : 'my site', # название нового счетчика 26 | 'url' : MY_SITE, # url ресурса где счетчик будет размешен 27 | 'email' : EMAIL, # email 28 | 'password' : PASSWORD, # пароль 29 | 'public' : 0, # 1 - счетчик публичный, 0 - отчет закрытый 30 | 'rating' : 0, # 1 - счетчик участвует в райтинге - 1, 0 - не учавствует 31 | # id категории, 0 - нет категории. 32 | # Для получения списка категорий можно воспользоваться /json/categories, 33 | # Опционально, требуется в случае участия в рейтинге (rating: 1). 34 | # Для участия в рейтинге выберите наиболее подходящую для Вашего ресурса категорию Рейтинга@Mail.ru. 35 | # Правильный выбор категории обеспечит Вам наибольший приток целевой аудитории со страниц Рейтинга@Mail.ru. 36 | # А также поможет сравнить популярность своего ресурса с популярностью ресурсов конкурентов. 37 | # см. https://top.mail.ru/help/ru/api/response - Информация о категориях рейтинга 38 | 'category' : 0 39 | }) 40 | if 'error' in result: 41 | print('registerSite(), error') 42 | pprint(result) 43 | sys.exit(1) 44 | 45 | counter_id = result['id'] 46 | 47 | # login() - авторизированиться по паролю 48 | # 1-й аргумент - id счетчика 49 | # 2-й аргумент - пароль к счетчику 50 | result = tmr.login(counter_id, PASSWORD); 51 | if not result: 52 | print('login() error') 53 | sys.exit(1) 54 | 55 | # getCode() - получить код счетчика 56 | # 1-й аргумент id счетчика 57 | # 2-й аргумент - пароль, если вы ранее и успешно вызвали login, то аргумент можно оставить пустым 58 | # 3-й аргумент - опции (см. https://top.mail.ru/help/ru/api/main -- Код счетчика) 59 | result = tmr.getCode(counter_id, '', { 'mode' : 'nologo', 'pagetype' : 'xhtml' }) 60 | if 'error' in result: 61 | print('getCode() error') 62 | pprint(result) 63 | sys.exit(1) 64 | 65 | print('Code') 66 | pprint(result) 67 | 68 | # getStat() - получить данные отчета 69 | # 1-й аргумент - id счетчика 70 | # 2-й аргумент - пароль, если вы ранее и успешно вызвали login, то аргумент можно оставить пустым 71 | # 3-й аргумент - тип отчета (см. https://top.mail.ru/help/ru/api/response) 72 | # 4-й аргумент - аргументы конкретной статистики 73 | # Более детально см. параметры запросов (https://top.mail.ru/help/ru/api/params) и 74 | # описания JSON ответов (https://top.mail.ru/help/ru/api/response) 75 | result = tmr.getStat(counter_id, PASSWORD, 'visits', { 'period' : 1 }) 76 | if 'error' in result: 77 | print('getStat(), error') 78 | pprint(result) 79 | sys.exit(1) 80 | 81 | print('Counter ' + counter_id + ', visits') 82 | # Результат зависит от типа отчета (см. https://top.mail.ru/help/ru/api/response) 83 | pprint(result) 84 | -------------------------------------------------------------------------------- /api/php/test-top_mail_ru.php: -------------------------------------------------------------------------------- 1 | registerSite(array( 24 | 'title' => 'my site', // название нового счетчика 25 | 'url' => $MY_SITE, // url ресурса где счетчик будет размешен 26 | 'email' => $EMAIL, // email 27 | 'password' => $PASSWORD, // пароль 28 | 'public' => 0, // 1 - счетчик публичный, 0 - отчет закрытый 29 | 'rating' => 0, // 1 - счетчик участвует в райтинге - 1, 0 - не учавствует 30 | // id категории, 0 - нет категории. 31 | // Для получения списка категорий можно воспользоваться /json/categories, 32 | // Опционально, требуется в случае участия в рейтинге (rating: 1). 33 | // Для участия в рейтинге выберите наиболее подходящую для Вашего ресурса категорию Рейтинга@Mail.ru. 34 | // Правильный выбор категории обеспечит Вам наибольший приток целевой аудитории со страниц Рейтинга@Mail.ru. 35 | // А также поможет сравнить популярность своего ресурса с популярностью ресурсов конкурентов. 36 | // см. https://top.mail.ru/help/ru/api/response - Информация о категориях рейтинга 37 | 'category' => 0 38 | )); 39 | if (array_key_exists('error', $result)) { 40 | echo 'registerSite() error'; 41 | print_r($result); 42 | exit(1); 43 | } 44 | 45 | $counterId = $result->id; 46 | 47 | // login() - авторизированиться по паролю 48 | // 1-й аргумент - id счетчика 49 | // 2-й аргумент - пароль к счетчику 50 | if (!$tmr->login($counterId, $PASSWORD)) { 51 | echo 'login() error'; 52 | exit(1); 53 | } 54 | 55 | // getCode() - получить код счетчика 56 | // 1-й аргумент id счетчика 57 | // 2-й аргумент - пароль, если вы ранее и успешно вызвали login, то аргумент можно оставить пустым 58 | // 3-й аргумент - опции (см. https://top.mail.ru/help/ru/api/main Код счетчика) 59 | $result = $tmr->getCode($counterId, $PASSWORD, array( 60 | 'mode' => 'nologo', 61 | 'pagetype' => 'xhtml' 62 | )); 63 | if (array_key_exists('error', $result)) { 64 | echo 'getCode() error'; 65 | print_r($result); 66 | exit(1); 67 | } 68 | 69 | echo 'Code'; 70 | print_r($result); 71 | 72 | // getStat() - получить данные отчета 73 | // 1-й аргумент - id счетчика 74 | // 2-й аргумент - пароль, если вы ранее и успешно вызвали login, то аргумент можно оставить пустым 75 | // 3-й аргумент - тип отчета (см. https://top.mail.ru/help/ru/api/response) 76 | // 4-й аргумент - аргументы конкретной статистики 77 | // Более детально см. параметры запросов (https://top.mail.ru/help/ru/api/params) и 78 | // описания JSON ответов (https://top.mail.ru/help/ru/api/response) 79 | $tmr->getStat($counterId, $PASSWORD, 'visits', array( 80 | 'period' => 1, 81 | )); 82 | if (array_key_exists('error', $result)) { 83 | echo 'getStat(), error'; 84 | print_r($result); 85 | exit(1); 86 | } 87 | 88 | echo 'Visits'; 89 | print_r($result); 90 | -------------------------------------------------------------------------------- /api/php/top_mail_ru.php: -------------------------------------------------------------------------------- 1 | apiKey = $apiKey; 22 | $this->returnAsArray = $returnAsArray; 23 | } 24 | 25 | /** 26 | * Performs an HTTP request. 27 | * @param $path 28 | * @param $argsArray 29 | * @param $returnAsArray 30 | * @return mixed|null 31 | */ 32 | protected function request($path, $argsArray, $returnAsArray) 33 | { 34 | $url = static::BASE_URL . $path . '?' . http_build_query($argsArray); 35 | $ch = curl_init(); 36 | curl_setopt($ch, CURLOPT_URL, $url); 37 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 38 | $data = null; 39 | try { 40 | $data = curl_exec($ch); 41 | curl_close($ch); 42 | $data = json_decode($data, $returnAsArray); 43 | } catch (Exception $e) { 44 | echo "Exception: {$e->getCode()} ({$e->getMessage()})", PHP_EOL; 45 | } 46 | return $data; 47 | } 48 | 49 | /** 50 | * Returns the API key and session arguments. 51 | * @return array 52 | */ 53 | protected function getKeyAndSession() 54 | { 55 | $args = array(); 56 | if ($this->apiKey) { 57 | $args['apikey'] = $this->apiKey; 58 | } 59 | if ($this->session) { 60 | $args['session'] = $this->session; 61 | } 62 | return $args; 63 | } 64 | 65 | /** 66 | * Registers a new site, API key is required. 67 | * @param $args 68 | * @return mixed|null 69 | */ 70 | public function registerSite($args) 71 | { 72 | $args += $this->getKeyAndSession(); 73 | return $this->request('/json/add', $args, $this->returnAsArray); 74 | } 75 | 76 | /** 77 | * Edits a site registration info. 78 | * @param $id 79 | * @param $password 80 | * @param $args 81 | * @return mixed|null 82 | */ 83 | public function editSite($id, $password, $args) 84 | { 85 | $args += $this->getKeyAndSession(); 86 | $args['id'] = $id; 87 | $args['password'] = $password; 88 | return $this->request('/json/edit', $args, $this->returnAsArray); 89 | } 90 | 91 | /** 92 | * Retrieves html code snipped for a site. 93 | * @param $id 94 | * @param $password 95 | * @param $args 96 | * @return mixed|null 97 | */ 98 | public function getCode($id, $password, $args) 99 | { 100 | $args += $this->getKeyAndSession(); 101 | $args['id'] = $id; 102 | $args['password'] = $password; 103 | return $this->request('/json/code', $args, $this->returnAsArray); 104 | } 105 | 106 | /** 107 | * Sets the session parameter for requests. 108 | * @param $session 109 | */ 110 | public function setSession($session) 111 | { 112 | $this->session = $session; 113 | } 114 | 115 | /** 116 | * Logs in using a password in order to get a session. 117 | * @param $id 118 | * @param $password 119 | * @return bool 120 | */ 121 | public function login($id, $password) 122 | { 123 | $args = array_merge( 124 | array('id' => $id, 'password' => $password, 'action' => 'json'), 125 | $this->getKeyAndSession() 126 | ); 127 | $res = $this->request('/json/login', $args, true); 128 | if ($res['session']) { 129 | $this->session = $res['session']; 130 | } 131 | return isset($res['logged']) && $res['logged'] === 'yes'; 132 | } 133 | 134 | /** 135 | * Retrieves statistics for a site. 136 | * @param $id 137 | * @param $password 138 | * @param $type 139 | * @param $args 140 | * @return mixed|null 141 | */ 142 | public function getStat($id, $password, $type, $args) 143 | { 144 | $args += $this->getKeyAndSession(); 145 | $args['id'] = $id; 146 | $args['password'] = $password; 147 | return $this->request('/json/' . $type, $args, $this->returnAsArray); 148 | } 149 | 150 | } 151 | --------------------------------------------------------------------------------