С тех пор, как я опубликовал пост о прокате на Douban, я обнаружил, что он быстро перегружен другими постами, но было слишком утомительно голосовать за пост вручную, 😭, поэтому я хотел освободить свои руки, автоматически проголосовав за пост!
Анализ запроса комментария
Через сетевой анализ Chrome
- URL-адрес комментария
https://www.douban.com/group/topic/129122199/add_comment - Он должен принимать 5 параметров, где ck — значение в куке, а rv_comment — комментарий.
- Вернуть 302 для перенаправления
Python Mock запрос:
# 豆瓣具体帖子
url = "https://www.douban.com/group/topic/129122199/"
# 豆瓣具体帖子回复的接口,格式是帖子链接+/add_comment
comment_url = url + "/add_comment"
cookie = 'cookie'
referer = url
agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
headers = {
"Host": "www.douban.com",
"Referer": referer,
'User-Agent': agent,
"Cookie": cookie
}
params = {
"rv_comment": '🆙',
"ck": re.findall("ck=(.*?);", headers["Cookie"])[-1],
'start': '0',
'submit_btn': '发送'
}
response = requests.post(comment_url, headers=headers, allow_redirects=False,
data=params, verify=False)
Просто запустите его напрямую.
Но, запустив его несколько раз, вы обнаружите, что возвращенный код состояния равен 200, и ни одна из верхних публикаций не является успешной. На самом деле это активировало антирептилию Дубана.
И поля captcha-solution и captcha-id также включаются при отправке запроса, когда мы топим пост.
В настоящее время обнаружено, что даже если каждый комментарий будет отстоять на 1 минуту, если это будет 3 раза, для проверки появится всплывающий код подтверждения.
Разбор капчи
Когда мы столкнемся с кодом подтверждения, мы взломаем код подтверждения.
tesserocr
Чтобы идентифицировать графический код проверки, вам необходимо установить библиотеку tesserocr.
tesserocr — это библиотека распознавания OCR для Python, но на самом деле она инкапсулирует tesseract со слоем API Python.Ядром является tesseract, поэтому перед установкой tesserocr вам необходимо установить tesseract.Tesseract(/'tesərækt/) Слово означает «гиперкуб», относящееся к четырехмерному стандартному кубу в геометрии, также известному как «правильный октаэдр», является широко используемым открытым исходным кодом.OCRинструмент.
Под Mac используйте brew для установки
brew install tesseract --all-languages
Далее устанавливаем tesserocr:
brew install imagemagick
pip install tesserocr pillow
Код Python выглядит следующим образом:
import tesserocr
from PIL import Image
if __name__ == '__main__':
# 新建Image对象
image = Image.open("/Users/liwenhao/Desktop/douban-captcha-example1.jpeg")
# 调用tesserocr的image_to_text()方法,传入image对象完成识别
result = tesserocr.image_to_text(image)
print(result)
Проверенные фотографии выглядят следующим образом:
Результат не признается.
Вместо этого попробуйте простое изображение:
Результат выглядит следующим образом:
5594
Похоже, что Tesseract может распознавать только некоторые простые проверочные коды, что не подходит для распознавания проверочных кодов Douban.
Попробуйте определить платформу капчи.
Байду OCR
Официальная документация по доступу: Документация по распознаванию символов-Python SDK Access
- Фокус: бесплатно
- Общая идентификация (включая удостоверения личности, банковские карты) 500 раз/день,
- Высокая точность 50 раз/день,
- Водительские права, водительские права, билет, бизнес-лицензия, общий билет - все 200 раз в день.
Уведомление:2.7.+ и 3.+ поддерживаются
Процесс настройки:
-
Сначала откройте счет Baidu;
-
открытьСлужба распознавания текста, и нажмите, чтобы использовать его сразу после открытия:cloud.baidu.com/product/OCR…
-
Нажмите на шаг 2, должно появиться подтверждающее сообщение, после подтверждения вы перейдете на личную домашнюю страницу пользователя, прокрутите вниз и щелкните непосредственно на распознавании текста:
-
Нажмите «Создать приложение», введите набор содержимого, нажмите «ОК», а затем нажмите «Мое приложение», гдеAPI KeyиSecret KeyНеобходимо использовать:
-
Нажмите в правом верхнем углу, центр пользователя, также необходимо использовать идентификатор пользователя:
-
Необходимая информация готова,pipустановить волну
pip install baidu-aip
испытать волну
import json
from aip import AipOcr
if __name__ == '__main__':
APP_ID = ' '
API_KEY = ' '
SECRET_KEY = ' '
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
# 读取图片
def get_file_content(file_path):
with open(file_path, 'rb') as fp:
return fp.read()
image = get_file_content('/Users/liwenhao/Desktop/douban-captcha-example2.jpg')
""" 调用通用文字识别(高精度), 图片参数为本地图片 """
result = json.dumps(client.basicAccurate(image))
print(result)
Проверенные фотографии выглядят следующим образом:
В результате получается волна:
{"log_id": 3968431492157876638, "words_result_num": 1, "words_result": [{"words": " minute:"}]}
Из результатов видно, что проверочный код распознан.
-
words_result_numколичество результатов распознавания -
words_resultпредставляет собой массив результатов позиционирования и идентификации -
wordsстрока результата идентификации
попробуй снова
Результат выглядит следующим образом:
{"log_id": 5251449865676063710, "words_result_num": 0, "words_result": []}
Если не распознать, то видно, что более сложные проверочные коды все равно не распознаются, но это бесплатно.
супер орел
Для нераспознанных ситуаций требуется кодирующая платформа.Индустрия славитсясупер орел.
Плата за Super Eagle взимается в соответствии с порядком величины, количество большое и дешевое, стандартная цена: 1 юань = 1000 баллов за вопрос, разные типы кодов подтверждения, требуемые баллы за вопрос разные, вы можете проверить здесь подробности.www.chaojiying.com/price.html
Код питона выглядит следующим образом:
from hashlib import md5
import requests
import json
# 通过超级鹰识别验证码
def recognition_captcha(filename, code_type):
im = open(filename, 'rb').read()
params = {
'user': '账号',
'pass2': md5('密码'.encode('utf8')).hexdigest(),
'softid': 'softid',
'codetype': code_type
}
headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
files = {'userfile': ('ccc.jpg', im)}
resp = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
headers=headers).json()
return resp
# 调用代码
if __name__ == '__main__':
print(json.dumps(recognition_captcha('/Users/liwenhao/Desktop/douban-captcha-example2.jpg', 1006)))
Загруженный код подтверждения — это код подтверждения, который не распознается системой оптического распознавания символов Baidu, описанной выше, а именно:
{"err_str": "OK", "err_no": 0, "md5": "0475b05654c376deb409bfef7eee75cd", "pic_id": "8054415552001300054", "pic_str": "yacvmd"}
найти проверочный кодyacvmdвышел. Но времени ушло около 5с. Позже тест показал, что проверочный код, созданный Douban, занял менее 1 секунды, поэтому с точки зрения времени и точности в конечном итоге была использована платформа кодирования Super Eagle.
Неудачное уведомление WeChat
Какой бы метод не использовался, могут быть сбои.Я не всегда могу использовать метод опроса.Я захожу посмотреть, удачны ли первые несколько раз, каждые несколько часов.Поэтому нужно асинхронное уведомление.Сначала я хотел использовать электронную почту. Позже было обнаруженоСерверный соусЭтот артефакт может помочь нам отправлять уведомления WeChat, и это очень просто.
В частности, вы можете просмотретьСерверный соус.
полный код
используя python2
import os
import requests
import urllib3
import re
from hashlib import md5
import random
from lxml import html
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s.%(msecs)03d %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
urllib3.disable_warnings()
# 下载验证码图片
def download_captcha(captcha_url, agent):
# findall返回的是一个列表
captcha_name = re.findall("id=(.*?):", captcha_url)
filename = "douban_%s.jpg" % (str(captcha_name[0]))
logging.info("文件名为: " + filename)
with open(filename, 'wb') as f:
# 以二进制写入的模式在本地构建新文件
header = {
'User-Agent': agent,
'Referer': captcha_url
}
f.write(requests.get(captcha_url, headers=header).content)
logging.info("%s 下载完成" % filename)
return filename
# 通过超级鹰识别验证码
def recognition_captcha(filename, code_type):
im = open(filename, 'rb').read()
params = {
'user': '用户',
'pass2': md5('密码'.encode('utf8')).hexdigest(),
'softid': 'softid',
'codetype': code_type
}
headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
files = {'userfile': ('ccc.jpg', im)}
resp = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
headers=headers).json()
# 错误处理
if resp.get('err_no', 0) == 0:
return resp.get('pic_str')
def result_verification(response):
if response.status_code == 302:
logging.info("豆瓣ding成功")
else:
logging.info(response.status_code)
logging.info(response)
url = "https://sc.ftqq.com/你的SCKEY.send?text=douban失败" + \
str(random.randint(0, 1000))
requests.post(url)
logging.info("豆瓣ding失败,发送失败信息到微信")
# 豆瓣顶帖
def douban_ding():
# 豆瓣具体帖子
url = "https://www.douban.com/group/topic/129122199/"
# 豆瓣具体帖子回复的接口,格式是帖子链接+/add_comment
comment_url = url + "/add_comment"
cookie = 'cookie'
referer = url
agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
headers = {
"Host": "www.douban.com",
"Referer": referer,
'User-Agent': agent,
"Cookie": cookie
}
params = {
"rv_comment": '🆙',
"ck": re.findall("ck=(.*?);", headers["Cookie"])[-1],
'start': '0',
'submit_btn': '发送'
}
response = requests.get(url, headers=headers, verify=False).content.decode('utf-8')
selector = html.fromstring(response)
captcha_image = selector.xpath("//img[@id=\"captcha_image\"]/@src")
if captcha_image:
logging.info("发现验证码,下载验证码")
captcha_id = selector.xpath("//input[@name=\"captcha-id\"]/@value")
filename = download_captcha(captcha_image[0], agent)
captcha_solution = recognition_captcha(filename, 1006)
os.remove(filename)
params['captcha-solution'] = captcha_solution
params['captcha-id'] = captcha_id
else:
logging.info("没有验证码")
response = requests.post(comment_url, headers=headers, allow_redirects=False,
data=params, verify=False)
result_verification(response)
if __name__ == '__main__':
douban_ding()
результат операции:
- 1-й:
2018-12-30 16:09:35.589 INFO: 没有验证码 2018-12-30 16:09:36.436 INFO: 豆瓣ding成功 - 4-й:
2018-12-30 16:13:02.135 INFO: 发现验证码,下载验证码 2018-12-30 16:13:02.135 INFO: 文件名为: douban_OJGsVa0hST4O2WhFA0VpMnR9.jpg 2018-12-30 16:13:02.554 INFO: douban_OJGsVa0hST4O2WhFA0VpMnR9.jpg 下载完成 2018-12-30 16:13:09.687 INFO: 豆瓣ding成功
Изображение эффекта:
Примечание:
- Контролируйте частоту топовых постов, иначе вас легко забанят.
Дубан запрещен