有人盗用了我的 DEV 文章!如何编写 Python 脚本检测被盗内容?编写 Python 脚本检测是否有人盗用了你的 DEV 文章?

2025-06-07

有人盗用了我的开发文章!如何编写 Python 脚本检测被盗内容

编写一个 Python 脚本来检查是否有人窃取了你的 DEV 帖子

去年春天,我的一篇博文获得了大量的浏览量和点赞,最终荣登当周热门文章榜单前七。作为一个新博主,我想弄清楚是什么让它如此受欢迎,以便在此基础上更上一层楼。然而,在调查过程中,我偶然发现了我自己的文章……竟然出现在别人的博客里!!!然后,我还发现他们的12个推特账号都在转发我的内容,还声称是他们自己的作品!!!DEV 的优秀员工帮助了我,并请求我删除被盗内容……但从那以后,我一直不敢发帖,担心这种情况会再次发生。

几个月后,我的工作涉及编写一个 Python 脚本,用于搜索可能用于作弊的网络内容。我立即意识到,类似的脚本可以用来监控网络,检测任何未经授权的 Dev.to 帖子抓取和转发行为。我最近还读了@saschat的帖子《获取 Dev.to 文章的历史统计数据》,该帖子使用 Dev.to API 获取每篇文章的数据。于是,我开始着手编写一个脚本,它既利用 Dev.to API 获取文章数据,又利用 Google 自定义搜索引擎 API 管理自定义搜索。

下面,我将分享我的流程和代码。希望您能跟着教程,使用 Python、Dev.to API 和 Google 自定义搜索引擎 API 构建您自己的脚本。本教程要求您具备一些 Python 基础知识,并熟悉如何从外部 API 获取数据。

编写一个 Python 脚本来检查是否有人窃取了你的 DEV 帖子

初始设置

创建项目文件夹和存储库

首先,您需要创建一个项目文件夹,创建一些占位符文件,初始化您的存储库并将其推送到 GitHub。
图片

我们将在文件中组织依赖项requirements.txt。在这个项目中,我们将首先安装requests包(用于从 API 请求数据)和colorama包(用于格式化打印到终端的文本)。将这些名称添加到文件中,然后运行pip3 install -r requirements.txt以一次性安装所有依赖项。
图片

设置 Google 自定义搜索引擎 API

图片
为了使用此 API 管理您的自定义搜索,您需要有一个 Google 帐户。按照Google 自定义搜索 JSON API 文档中的链接为您的项目设置一个 API 密钥,并记下来。然后点击Google 可编程搜索控制面板链接设置您的自定义搜索并生成您的搜索引擎 ID。您需要选择至少一个网站域名包含在您的搜索中,所以现在,只需将其设置为dev.to/*,以及您的文章应该显示在网络搜索中的任何其他网站。由于我将我的文章发布到 Twitter(偶尔也会发布到 LinkedIn 和 GitHub),所以我也添加了这些域名。这将帮助我们开始测试脚本,一旦我们确信脚本可以正常工作,我们就可以添加/优化自定义搜索参数。
图片

按下“创建”后,请点击链接进入控制面板,完成搜索设置并获取搜索引擎 ID。保存搜索引擎 ID 以供日后使用,并保持控制面板处于打开状态,因为我们稍后会修改设置。

设置 Dev.to API

接下来,您需要获取 Dev.to API 的 API 密钥。请前往您的开发设置页面,点击“帐户”,然后滚动到“开发 API 密钥”部分。只需添加项目名称,系统就会生成一个新密钥。请记下这个密钥。更多详情,请访问DEV API 文档
图片

将 API 密钥和搜索引擎 ID 保存到 config.py

首先,请确保已将该config.py文件添加到您的文件中.gitignore,以防止其被 GitHub 追踪。接下来,将您刚刚生成的所有密钥和 ID 添加到config.py文件中,以确保它们的安全。

完成后,文件应如下所示,其中每个键/ID 都存储为一个字符串。
图片

如果您需要有关保护 API 密钥的资源,我推荐 BlackTechDiva 的文章“隐藏您的 API 密钥”,以获得清晰简洁的教程。

从 Dev.to API 获取文章数据

现在,我们就可以开始使用这些 API 密钥了!首先,我们将获取 Dev.to API 的数据,检索我们在 DEV 上发布的所有文章,然后使用响应数据创建一个文章标题列表,以便在自定义搜索中使用。

图片

在该search.py文件中,我们需要import requests,以便我们能够从 Dev.to API 请求数据。我们还import config需要访问存储在该文件中的 API 密钥。

我们的请求将以这种格式返回我们的文章数据:
图片

通过循环遍历数据对象,我们通过访问 创建一个包含所有已发布文章标题的列表 (article_list) article["title"]。我们还可以创建一个 recent_articles 列表,以便对最近十篇文章 (recent_articles) 的子集进行搜索:
图片

构建通用搜索脚本

一旦我们有了文章列表,我们就可以设置一个通用搜索脚本,该脚本将使用每个文章标题作为搜索词,并将前 10 个谷歌搜索结果(基于我们自定义搜索引擎中的设置)打印到终端。

图片
首先,我们将导入并启动 colorama,这将允许我们在搜索结果打印到终端时添加颜色格式。该参数autoreset=True将在每行打印后将颜色恢复为默认值。

图片
接下来,我们将设置搜索逻辑。我们需要遍历最近文章列表,并针对每个标题向 Google 自定义搜索 API 发出请求。每篇文章标题搜索的响应将是一个大型字典,匹配结果将存储在“items”键中。我们可以设置 hits 变量,通过索引结果来包含前 10 条匹配结果。

接下来,我们可以遍历 hits 列表,设置将结果打印到终端的逻辑。通过添加try:andexcept:逻辑,我们可以避免在搜索词未命中时抛出错误。

注意:在本例中,我目前已将 recent_articles 列表限制为 10 篇文章,并将 hits 列表限制为 10 条结果。这是基于 API 的每日查询限制,即每天允许 100 次查询。您可以随意调整这些数字,但在选择时请务必注意每日限制。有关每日限制的更多信息,请参阅文档

此时运行脚本,我们将获得 10 篇文章标题对应的前 10 个结果的打印输出,这些结果来自我们在之前步骤中在 Google 自定义搜索控制面板中指定的任意域名。在我的示例中,打印输出显示了我在 Dev.to、Twitter、LinkedIn 和 Github 上的文章链接。例如:
图片

整合起来

至此,我们已经有了一个脚本,可以检测我们最近在哪些网站上发布的帖子,这些帖子是我们期望看到的。但是,如果我们的最终目标是在网络上搜索被盗的博客内容,则需要在 Google 自定义搜索引擎控制面板中修改设置。点击“设置”,然后点击“高级”。现在,您可以修改之前的设置,添加您想要从搜索中排除的域名。经过一些手动测试后,我最终将设置修改为如下所示,这样我就可以搜索整个网络,但排除我自己通过自己的帐户分享的内容:

图片

以下是新搜索输出的示例,其中突出显示了我的文章标题在网络上显示的一些其他位置:

图片

虽然前两次分享或转发都是无害的,但第三次却令人担忧,因为它与原始被盗内容的推特账号和博客地址相符。

最后的想法

完善控制面板中的 Google 可编程搜索设置肯定需要反复尝试——你需要找到一个最佳平衡点,既要排除你自己的帖子和分享,又要包含其他域名和其他人对你作品的引用。之后,你需要手动浏览搜索结果。大多数搜索结果都是无害的,就像上面提到的两个一样——找到并喜欢你作品的人(或机器人)会分享它!但你也可能会发现一些网站抄袭了你的作品并重新发布,却没有注明出处,这些网站应该被举报,并要求其删除被盗内容。

试试这个!

完成脚本后,您可以进行一些修改和改进,使其变得更好:

  • 尝试不同的搜索条件:可以尝试搜索博客内容的片段,而不仅仅是标题。
  • 优化控制面板中的设置:哪些设置可以为您提供最相关的点击次数?
  • 修改脚本中的数字:你想看到更少的帖子,却看到更多的点击量吗?只需调整一下列表的索引方式即可。
  • 创建脚本来搜索不同的内容:您还可以使用 Google 自定义搜索来做什么?

查看存储库

感谢阅读!如果你想查看我的代码库,可以在这里查看。

资源

由于整篇文章的重点是保护知识产权,因此在应得的赞扬之处给予肯定至关重要!我使用了以下资源来帮助完成这个项目:

文章来源:https://dev.to/jessesbyers/someone-stole-my-dev-article-how-to-build-a-python-script-to-detect-stolen-content-54fg
PREV
7 分钟内理解大 O 符号
NEXT
您想参加 DEV 演讲/研讨会吗?