Python Douban Top Post

Python

🆙🆙

С тех пор, как я опубликовал пост о прокате на Douban, я обнаружил, что он быстро перегружен другими постами, но было слишком утомительно голосовать за пост вручную, 😭, поэтому я хотел освободить свои руки, автоматически проголосовав за пост!

Анализ запроса комментария

Через сетевой анализ Chrome

add_comment

  • 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, и ни одна из верхних публикаций не является успешной. На самом деле это активировало антирептилию Дубана.

Сработал проверочный код Douban

И поля 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)

Проверенные фотографии выглядят следующим образом:

douban-captcha-example1
douban-captcha-example1

Результат не признается.

Вместо этого попробуйте простое изображение:

captcha-example1.jpg

Результат выглядит следующим образом:

5594

Похоже, что Tesseract может распознавать только некоторые простые проверочные коды, что не подходит для распознавания проверочных кодов Douban.

Попробуйте определить платформу капчи.

Байду OCR

Официальная документация по доступу: Документация по распознаванию символов-Python SDK Access

  • Фокус: бесплатно
  • Общая идентификация (включая удостоверения личности, банковские карты) 500 раз/день,
  • Высокая точность 50 раз/день,
  • Водительские права, водительские права, билет, бизнес-лицензия, общий билет - все 200 раз в день.

Уведомление:2.7.+ и 3.+ поддерживаются

Процесс настройки:

  1. Сначала откройте счет Baidu;

  2. открытьСлужба распознавания текста, и нажмите, чтобы использовать его сразу после открытия:cloud.baidu.com/product/OCR…

  3. Нажмите на шаг 2, должно появиться подтверждающее сообщение, после подтверждения вы перейдете на личную домашнюю страницу пользователя, прокрутите вниз и щелкните непосредственно на распознавании текста:

  4. Нажмите «Создать приложение», введите набор содержимого, нажмите «ОК», а затем нажмите «Мое приложение», гдеAPI KeyиSecret KeyНеобходимо использовать:

  5. Нажмите в правом верхнем углу, центр пользователя, также необходимо использовать идентификатор пользователя:

  6. Необходимая информация готова,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)

Проверенные фотографии выглядят следующим образом:

douban-captcha-example1
douban-captcha-example1

В результате получается волна:

{"log_id": 3968431492157876638, "words_result_num": 1, "words_result": [{"words": " minute:"}]}

Из результатов видно, что проверочный код распознан.

  • words_result_numколичество результатов распознавания
  • words_resultпредставляет собой массив результатов позиционирования и идентификации
  • wordsстрока результата идентификации

попробуй снова

douban-captcha-example2
douban-captcha-example2

Результат выглядит следующим образом:

{"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, описанной выше, а именно:

douban-captcha-example2
douban-captcha-example2
Результат выглядит следующим образом:

{"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. 1-й:
    2018-12-30 16:09:35.589 INFO: 没有验证码
    2018-12-30 16:09:36.436 INFO: 豆瓣ding成功
    
  2. 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成功
    

Изображение эффекта:

Примечание:

  1. Контролируйте частоту топовых постов, иначе вас легко забанят.
    Дубан запрещен