如何解决为什么我的异步代码没有在 Python 中返回 Javascript 呈现的重定向 URL?
我正在使用带有 requests_html
库的 Telethon(电报 API 的 Python 实现)来获取 Javascript 呈现的重定向 URL。我启动了一个 Telethon 服务来捕获任何传入的消息并打印消息中传入 URL 的重定向 URL。但是这个脚本运行了几个小时没有打印任何 URL。
例如,当消息包含 URL 时,例如,https://clk.Tradedoubler.com/click?p=258296&a=3045611&g=24925292
那么,@client.on(events.NewMessage(pattern=r'(?i).*\b(https|http)\b'))
将触发并打印此 URL 的 Javascript 重定向 URL,即 https://www.samsung.com/es/smartphones/galaxy-s21-5g/buy/?modelCode=SM-G991BZVDEUB/?cid=es_paid_affiliate_Acquisiton_IM_alwayson_AcquisitionAO2020_other_EstandarNone-20210107_IPES&dclid=CjkKEQiAx9mABhC2-ICAmKGen4oBEiQACGtEOECzKOijcgzUGgP8D5r9rQ5PAoXlR2OMeJEvVD75VvPw_wcB
在控制台中的帮助from requests_html import AsyncHTMLSession
但它不起作用。
我试过的代码:
#-*- coding: utf-8 -*-
import os
import sys
import time
import re
import asyncio
import logging
from telethon import TelegramClient,events,utils
from requests_html import AsyncHTMLSession
logging.basicConfig(level=logging.INFO)
logging.getLogger('telethon').setLevel(level=logging.WARNING)
asession = AsyncHTMLSession()
def findURLs(string):
regex = r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“�‘’]))"
url = re.findall(regex,string)
return [x[0] for x in url]
async def clean_url(url_to_check):
r = await asession.get(url_to_check)
await r.html.arender(sleep=10,timeout=0,keep_page=True)
#resp=r.html.raw_html
return r.html.page.url
def get_env(name,message,cast=str):
if name in os.environ:
return os.environ[name]
while True:
value = input(message)
try:
return cast(value)
except ValueError as e:
print(e,file=sys.stderr)
time.sleep(1)
client = TelegramClient('anon1',2224000,'8a785be31a7b24eb6a919418028d5c5').start()
@client.on(events.NewMessage(pattern=r'(?i).*\b(https|http)\b'))
async def handler(event):
sms = event.message.text
lines = sms.splitlines(True)
for line in lines:
line_urls = findURLs(line)
for u in line_urls:
if asyncio.get_event_loop().is_running(): # Only patch if needed (i.e. running in Notebook,Spyder,etc)
import nest_asyncio
nest_asyncio.apply()
loop_inner = asyncio.get_running_loop()
rslt = loop_inner.create_task(clean_url(u))
await rslt
print(f"{u} ==> {rslt.result()}")
try:
print('(Press Ctrl+C to stop this)')
client.run_until_disconnected()
finally:
client.disconnect()
我没有得到 print(f"{u} ==> {rslt.result()}")
的输出。
我使用 Python 3.8.5
和 Telethon 1.19.1
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。