微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的异步代码没有在 Python 中返回 Javascript 呈现的重定向 URL?

如何解决为什么我的异步代码没有在 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 举报,一经查实,本站将立刻删除。