如何将托管在 GitHub 上的 JavaScript 数组解析为 Python 列表?

Posted

技术标签:

【中文标题】如何将托管在 GitHub 上的 JavaScript 数组解析为 Python 列表?【英文标题】:How can I parse a JavaScript array hosted on GitHub into a Python list? 【发布时间】:2022-01-21 19:23:56 【问题描述】:

我有一个用 Python 编写的 Discord 机器人,我想添加一个功能,让它立即删除它找到的任何网络钓鱼链接。

我查找了已知网络钓鱼域的列表,发现this on GitHub.

但问题是这是一个带有一个大数组的 JS 文件,而我的机器人是 100% Python。

我可以复制这个列表,但是我失去了它不断更新的优势,所以如果可能的话,我想直接从 GitHub 读取域。

我不确定如何获取并将其解析为 Python 列表。

在 *** 上环顾四周,人们建议将数据解析为 JSON,或者使用正则表达式,但不幸的是我还没有完全理解。

指导会有所帮助 - 或者也许您有更好的做事方式,而不是这种方式!谢谢

【问题讨论】:

美汤在这里有点矫枉过正,你不觉得吗? 【参考方案1】:

这是一种方法(容易失败,绝对不是推荐的方法):

import requests

RAW_DATA_LINK = "https://raw.githubusercontent.com/nikolaischunk/discord-phishing-links/main/domain-list.js"


def get_data():
    response = requests.get(RAW_DATA_LINK)
    data = response.content.decode()
    data = data.replace("const suspiciousDomains = ", "").replace(";", "")  # or just data[26:-2]
    return eval(data)

get_data() 将为您提供该文件中所有链接的列表。 您还可以在发出请求时尝试使用会话...

同样,如果您可以控制该文件,只需将其存储为 json,如果您无法控制,则使用正则表达式可能会更好。

【讨论】:

谢谢!我将其转换为use aiohttp instead 以避免额外导入requests。您能否详细说明为什么这容易失败/为什么实施它会是一个问题?只要 repo 和此文件存在,这将始终有效,对吗? 即使该文件存在,该文件也有可能发生变化。假设名称从suspiciousDomains 更改为Domains,这会破坏这个程序。 (尽管您可以通过使用 split 而不是 replace 来适应这种类型的更改)但我认为您不会在使用正则表达式时遇到这些类型的问题,您可以使用表达式 \[.*\] 来提取所需的数据。此外,对从 Internet 下载的数据使用 eval 存在安全风险。 @SujalSingh 使用 eval 是 huge security risk,尤其是作者试图从互联网上抓取数据【参考方案2】:

免责声明:我无法看到原始的 js 文件,因此可能存在一些不准确之处。编写此答案是为了提供使用 eval() 的替代方法,因为它存在巨大的安全风险。阅读Eval really is dangerous。

我假设 javascript 文件是这样的:

const suspiciousDomains = 
  "domains": [
    "tinyurl.com/yyw8sy9b",
    "tinyurl.com/yyyz9xdg",
    "token-bit.com"
  ]
;
import requests
import json  

RAW_DATA_LINK = "https://raw.githubusercontent.com/nikolaischunk/discord-phishing-links/main/domain-list.js" // the now dead link

def get_data():
    # credit to @Sujal Singh
    data = response.content.decode().replace("const suspiciousDomains = ", "").replace(
        ";", "")  # or just data[26:-2]
    # use json.loads() instead
    return json.loads(data) 

json.loads() 不直接评估字符串,而是解析字符串。 要了解json.loads() 做了什么,您可以阅读this。

【讨论】:

以上是关于如何将托管在 GitHub 上的 JavaScript 数组解析为 Python 列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将本地文件上传到github托管

如何在托管在 GitHub 上的 Python 脚本中保密开发人员密钥

如何在托管在 GitHub 上的 Python 脚本中保密开发人员密钥

从托管在 GitHub 上的 Spring Cloud Config Server 访问的 repo 的身份验证问题

如何将 Apple 推送通知支持添加到 Heroku 上的自托管 Parse 服务器?

链接并执行托管在 GitHub 上的外部 JavaScript 文件