txq0211 发表于 2022-3-28 11:23

爬虫之微信发送每天60秒读懂世界

最近自学爬虫,看的公众号有人在推“每天60秒读懂世界”,尝试用爬虫实现,通过微信推送。
抛砖引玉,有请大神们多多指导。

1.Windows下打开微信,固定在屏幕左上角,这样便于我们固定微信上各个控件所在坐标
2.把鼠标移动到微信左边的“通讯录”按钮上,单击,打开通讯录
3.把鼠标移动到搜索框把你要找的人的微信名复制进去,回车,打开对话框
(你要问我为什么要先打开通讯录再去搜索框搜?百度很多,大多失效了,就这个有效,微信部分代码我是抄脚本之家的)
4.通过爬虫获取每天60秒都懂世界内容,回车或者alt+s 发送
上效果图:



上代码:
# Pycharm使用Alt+Enter大法,自动安装软件包
import requests
import win32clipboard as w
import win32con
import win32api
import win32gui
import time
import requests
from parsel import Selector
# 爬虫
def getUrl(url):
    headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:98.0) Gecko/20100101 Firefox/98.0'}
    response = requests.get(url=url,headers=headers)
    return response

# 把文字放入剪贴板
def setText(aString):
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_UNICODETEXT, aString)
    w.CloseClipboard()

# 模拟ctrl+V
def ctrlV():
    win32api.keybd_event(17, 0, 0, 0)# ctrl
    win32api.keybd_event(86, 0, 0, 0)# V
    win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)# 释放按键
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)

# 模拟alt+s
def altS():
    win32api.keybd_event(18, 0, 0, 0)
    win32api.keybd_event(83, 0, 0, 0)
    win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(18, 0, win32con.KEYEVENTF_KEYUP, 0)

# 模拟enter
def enter():
    win32api.keybd_event(13, 0, 0, 0)
    win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)

# 模拟单击
def click():
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

# 移动鼠标的位置
def movePos(x, y):
    win32api.SetCursorPos((x, y))

if __name__ == "__main__":
    name = input('请输入消息接收人:')
    # 获取鼠标当前位置
    # hwnd=win32gui.FindWindow("MozillaWindowClass",None)
    hwnd = win32gui.FindWindow("WeChatMainWndForPC", None)
    win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
    win32gui.MoveWindow(hwnd, 0, 0, 1000, 700, True)
    time.sleep(0.01)
    # 1.移动鼠标到通讯录位置,单击打开通讯录
    movePos(28, 147)
    click()

    # 2.移动鼠标到搜索框,单击,输入要搜索的名字
    movePos(148, 35)
    click()
    setText(name)
    ctrlV()
    time.sleep(1)# 别问我为什么要停1秒,问就是给微信一个反应的时间,他反应慢反应不过来,其他位置暂停的原因同样
    enter()
    time.sleep(1)
    # 3.复制要发送的消息,发送
    time.sleep(1)
    url = 'https://www.zhihu.com/people/mt36501'
    html = Selector(getUrl(url).text)
    links = 'https:%s' % html.css('.ContentItem-title span a::attr(href)').get()
    content_html = Selector(getUrl(links).text)
    contents = content_html.css('.RichText p::text').getall()
    content = '\n'.join(contents)
    setText(content)
    ctrlV()
    altS()


后续:如果要发多人,可以做一个字典,或者做一个Excel表格循环读取发送,这里不多叙述。

txq0211 发表于 2022-3-28 13:57

本帖最后由 txq0211 于 2022-3-28 14:00 编辑

懒得修改了,不用接口也是一方面特点
接口版本,加上import json,替换73-78行
import requests,json
from parsel import Selector

def getUrl(url):
    headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:98.0) Gecko/20100101 Firefox/98.0'}
    response = requests.get(url=url,headers=headers)
    return response
if __name__ == '__main__':
    url = 'https://www.zhihu.com/api/v4/columns/c_1261258401923026944/items?limit=1'
    data = json.loads(getUrl(url).text)["data"]["content"]
    content = '\n'.join(Selector(data).css('p::text').getall())
    print(content)

情绪666 发表于 2022-3-28 14:38

可以的话其实用方糖或者企业微信做推送会方便一些,我之前写的用的方糖的,每天早...

本帖最后由 情绪666 于 2022-3-28 14:40 编辑

txq0211 发表于 2022-3-28 13:57
懒得修改了,不用接口也是一方面特点
接口版本,加上import json,替换73-78行
#可以的话其实用方糖或者企业微信做推送会方便一些,我之前写的用的方糖的,每天早上七点定时推送,只是定时时间是自己算的,用死循环写的也不太好{:1_937:}


# -*- coding: utf-8 -*-
# @Time : 2021/11/26 9:58
# @AuThor : Melon
# @site :
# @note :
# @file : today60.py
# @Software: PyCharm
import logging
import time
import traceback
from datetime import datetime, timedelta

import requests
from lxml import etree

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

BASE_URL = 'http://www.zhihu.com/api/v4/columns/c_1261258401923026944/items?limit=1'

FT_SERVER_URL = 'https://sctapi.ftqq.com/方糖key.send'


def send_msg(title, message):
    data = {
      'title': title,
      'desp': message,
    }
    post = requests.post(url=FT_SERVER_URL, data=data)
    logger.info(post.text)


def start():
    response = requests.get(url=BASE_URL, headers={"User-Agent": None})

    response_json = response.json()

    response_json_data = response_json['data']

    data_content = response_json_data['content']
    # xpath解析
    html = etree.HTML(data_content)
    image = html.xpath("//figure/img/@data-original")
    st = '\n\n【 %s 】 %s \n\n\n\n' % (response_json_data['title'], image)
    # print(image)
    p_text = html.xpath("//p/text()")
    for text in p_text:
      st += text + '\n\n'
    send_msg(response_json_data['title'], st)
    return st


if __name__ == '__main__':
    while True:
      try:
            # 定时
            now = datetime.now()# 记录当前时间

            sched_time = datetime.strptime(str(now.replace(hour=7, minute=00, second=00))[:19], '%Y-%m-%d %H:%M:%S')
            total_seconds = (sched_time - datetime.now()).total_seconds()# 两个时间的差值

            if total_seconds < 0:
                now += timedelta(days=1)
                # 过了今天的 7 点,计算明天 7 点,进行定时
                sched_time = datetime.strptime(str(now.replace(hour=7, minute=00, second=00))[:19], '%Y-%m-%d %H:%M:%S')
                sched_time_total_seconds = (sched_time - datetime.now()).total_seconds()# 两个时间的差值
                logging.info('当前时间: %s\t距离下次发送时间: %s\t还差: %s 秒' % (str(datetime.now()), sched_time, sched_time_total_seconds))
                time.sleep(sched_time_total_seconds)
            else:
                logging.info('当前时间: %s\t距离下次发送时间: %s\t还差: %s 秒' % (str(datetime.now()), sched_time, total_seconds))
                time.sleep(total_seconds)

            # 定时完成,开始发送
            s = start()
            logging.info(s)
      except Exception as e:
            traceback.print_exc()
            logging.error('------- error -----> %s', e)
            time.sleep(5)

zfj68888 发表于 2022-3-28 11:52

估计是我太菜了,不是太懂呢,有更直接点的工具吗。{:1_937:}

txq0211 发表于 2022-3-28 11:58

zfj68888 发表于 2022-3-28 11:52
估计是我太菜了,不是太懂呢,有更直接点的工具吗。

可以转成程序

kof21411 发表于 2022-3-28 12:00

用按键精灵不是更放便吗?

情绪666 发表于 2022-3-28 12:02

接口{:301_998:} http://www.zhihu.com/api/v4/columns/c_1261258401923026944/items?limit=1

txq0211 发表于 2022-3-28 12:22

情绪666 发表于 2022-3-28 12:02
接口 http://www.zhihu.com/api/v4/columns/c_1261258401923026944/items?limit=1

哈哈,谢谢,之前没找到,只好用笨方法

txq0211 发表于 2022-3-28 12:24

情绪666 发表于 2022-3-28 12:02
接口 http://www.zhihu.com/api/v4/columns/c_1261258401923026944/items?limit=1

主要还是想要每天自动获取最新,明天试试这个接口

等待穿山乙 发表于 2022-3-28 12:26

txq0211 发表于 2022-3-28 12:24
主要还是想要每天自动获取最新,明天试试这个接口

速度更新

d8349565 发表于 2022-3-28 13:08

个人偏好使用这个库制作RPA工具
import pyautogui

血情 发表于 2022-3-28 13:33

有软件,就更好啦
页: [1] 2 3
查看完整版本: 爬虫之微信发送每天60秒读懂世界