【问题标题】:How can I parse a JavaScript array hosted on GitHub into a Python list?如何将托管在 GitHub 上的 JavaScript 数组解析为 Python 列表?
【发布时间】:2025-12-25 01:25:12
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 美汤在这里有点矫枉过正,你不觉得吗?

标签: python arrays list github discord.py


【解决方案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

【讨论】: