""" @Time : 2022/8/8 11:04 @Author : superhero @Email : 838210720@qq.com @File : get_friends.py @IDE: PyCharm """
import asyncio from playwright.async_api import async_playwright import re import json from urllib import parse import requests from config import plugin_config import feedparser import random import socket
link_path = plugin_config.link_path
""" 检查友链的博客主题必须是Butterfly主题,友链的博客是什么主题就无所谓了 """ class friend_qu: def __init__(self, url): """ :param url: 你的友链链接,必须Butterfly主题 """ self.link = url self.data = dict()
async def cancel_request(self, route, request): await route.abort()
async def get_friends(self) -> dict: """ 获取你的所有友链信息 :return: """
async with async_playwright() as p: browser = await p.chromium.launch(headless=True) page = await browser.new_page() response = await page.goto(self.link) if response.status != 200 and response.status != 503: exit(1) await page.route(re.compile(r"(\.png)|(\.jpg)|(\.css)|(\.webp)|(\.js)"), self.cancel_request) await page.click('xpath=//*[@id="article-container"]/div') res = await page.query_selector_all('xpath=//*[@id="article-container"]//div/a')
x = 0 kk = [] title = '' datas = {} k = [] for element in res: text = await element.text_content() if text: x += 1
x1 = len(res) / x
x = 0 x2 = 0 for element in res: x += 1 href = await element.get_attribute("href") text = await element.text_content() print('获取友链进度:' + str(round(x / len(res) * 100, 1)) + '%') k.append(href) x2 += 1 if text: title = text
if x1 - x2 <= 0: k = sorted(k, key=len) kk += [{'desc': title, 'url': k}] k = [] x2 = 0
self.data.update({'data': kk}) print(self.data) await page.close() await browser.close() return datas
async def friend_post(self, ran=False): """ 进入你友链的主页获取一篇他的文章 :param ran: 是否随机取一篇文章,默认否,取最新文章 :return: """ kk = [] x = 0 data_json = dict()
for urls in self.data['data']: x += 1 print('获取文章进度:' + str(round(x / len(self.data['data']) * 100, 1)) + '%') url = urls['url'][0] url = url + 'atom.xml' if url[-1] == '/' else url + '/atom.xml' avatar = '' if len(urls['url']) == 1 else urls['url'][len(urls['url']) - 1] try: ret = feedparser.parse(url) socket.setdefaulttimeout(5) if ret['status'] == 200: num = 0 if ran is False else random.randint(0, len(ret.entries) - 1) kk += [{'title': ret['entries'][num]['title'], 'num': len(ret.entries), 'url': ret['entries'][num]['link'], 'date': ret['entries'][num]['published'], 'avatar': avatar, 'author': urls['desc'] }] else: print('未开启rss') except: print('未开启rss')
data_json.update({'data': kk}) print(json.dumps(data_json)) """ 返回字段释义 {"data": [{"title": "\u81ea\u5b9a\u7fa9\u5074\u908a\u6b04", "num": 17, "url": "https://butterfly.js.org/posts/ea33ab97/", "date": "2020-12-30T13:48:10.000Z", "avatar": "https://butterfly.js.org/img/avatar.png"}]} title: 文章标题 num: 文章总数 url: 文章链接 date: 文章发表时间 非更新时间 avatar: 头像 下次更新适配未开启rss的博客 """ return data_json
async def friend_query(self): """ 进入你友链的主页获取对方是否添加了你 :return: """ k = [] kk = {} datas = {} x1 = 0 session = requests.Session() for i in self.data['data']: x1 += 1 link = i['url'][0] host = parse.urlparse(self.link).netloc print('查询友链进度:' + str(round(x1 / len(self.data['data']) * 100, 1)) + '%') if host not in link: data = i for links in link_path: friend_link = link + links + '/' if link[-1] == '/' else (link + '/%s/' % links) print(friend_link) try: response = session.get(friend_link, timeout=5) if response.status_code == 200: html = response.text if host in html: kk = {'add': True} else: kk = {'add': False} break else: kk = {'msg': '请求失败'} except Exception as e: kk = {'msg': '请求失败'} print(e) data.update(kk) k.append(data) datas.update({'data': k}) print(json.dumps(datas)) """ [{"desc": "\u5f20\u6d2aHeo \u5206\u4eab\u8bbe\u8ba1\u4e0e\u79d1\u6280\u751f\u6d3b", "url": ["https://blog.zhheo.com/"], "add": true}] 返回字段释义:desc=昵称加个性签名 url:博客地址 add:是否添加了你 msg:一般是请求失败了,他的友链路径非“/link” """ return datas
async def main(): url = 'https://akilar.top/link/' res = friend_qu(url) await res.get_friends() await res.friend_query() await res.friend_post(False)
if __name__ == '__main__': asyncio.run(main())
|