[博客翻译]Show HN:用Ollama诱骗短信垃圾邮件发送者


原文地址:https://evan.widloski.com/software/sms_llm/


短信大语言模型(SMS LLM)

项目文件

我偶尔会收到一些房产经纪人的短信,他们想在我家乡购买特定的房产,而我在那里既没有房产也不居住。我猜他们是从白页(WhitePages)上抓取了手机号码,然后广撒网,希望能得到回复。
典型的垃圾短信
我父母在镇中心有一些未开发的土地,大部分位于洪水区,实际可用的面积比纸面上看起来要少得多。当然,经纪人并不知道这一点,所以购买一大块几十年来一直空置的土地,价格便宜,可能让他们垂涎三尺。
在圣诞节假期期间,我开发了一个系统,可以通过MQTT从运行Ollama的远程工作站控制我手机的短信应用程序。以下是系统的概述:

安卓手机         大语言模型服务器  
          +---------------+   |             
          | 短信应用程序 |   |            
 短信受害者 ------|   应用    |               
          +---------------+   |            
              |       |            
          +---------------+       +---------------+
          | 网关应用 |--------------| MQTT代理 |
          +---------------+       +---------------+
                      |        |    
                      |    +---------------+
                          |  llm.py   |
                      |    +---------------+
                      |        |    
                          +---------------+
                      |    | Ollama服务器 |
                      |    +---------------+

将短信传输到大语言模型

第一步是将短信以某种方式转发到大语言模型工作站。F-Droid和Play商店上都有几个短信转发工具,但大多数只支持通过POST请求将收到的短信单向转发到某个REST端点。我看到有一个应用程序支持将消息POST回手机,但由于手机位于CGLAN后面,我确实希望有一种与工作站保持长连接的方式。
最终我找到了一个名字很长的应用Android-SMS-Gateway-MQTT,它在后台运行,等待发送/接收消息,并且无需更改默认的短信应用程序。
出于某种原因,该应用程序可以通过MQTT发送消息,但接收到的消息只能通过POST请求转发。我做了一些修改,使MQTT可以双向通信。
我其实不太喜欢碰安卓开发,所以我尝试用Cursor.ai来修改代码,结果第一次就成功了!我使用的提示如下:

[SMSListener.java (41-46)]
如何将这个POST请求转换为MQTT消息?如果可能的话,我想使用文件`BackgroundService.java`中已经存在的MQTT连接。

修改后的网关应用
为了确保应用程序在后台可靠运行,必须禁用电池优化。幸运的是,该应用的功耗非常低。.apk文件可以在项目文件中找到。

Python脚本

Python脚本的任务很简单,就是监听MQTT上的新短信,并将生成的大语言模型响应发送回安卓应用程序。我希望语言模型能够根据上下文给出有意义的回复,因此我将每个正在进行的对话存储在一个单独的JSON文件中,并在生成响应时将最后N条消息提供给语言模型。

[
  {
    "role": "user",
    "content": "我忘记注册ece500