如何将托管在 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 列表?的主要内容,如果未能解决你的问题,请参考以下文章