<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: UPGPT主理人</title>
    <description>The latest articles on DEV Community by UPGPT主理人 (@upgpt-pro).</description>
    <link>https://dev.to/upgpt-pro</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4028617%2Fa89d3808-312c-469c-a37d-dabca8dd6cb2.png</url>
      <title>DEV Community: UPGPT主理人</title>
      <link>https://dev.to/upgpt-pro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/upgpt-pro"/>
    <language>en</language>
    <item>
      <title>用 Python 读取短信报价：整数金额、超时与 429 的处理</title>
      <dc:creator>UPGPT主理人</dc:creator>
      <pubDate>Tue, 20 Oct 2026 04:46:27 +0000</pubDate>
      <link>https://dev.to/upgpt-pro/yong-python-du-qu-duan-xin-bao-jie-zheng-shu-jin-e-chao-shi-yu-429-de-chu-li-1694</link>
      <guid>https://dev.to/upgpt-pro/yong-python-du-qu-duan-xin-bao-jie-zheng-shu-jin-e-chao-shi-yu-429-de-chu-li-1694</guid>
      <description>&lt;p&gt;我在运营 RaySMS。本文由 AI 辅助编写，示例行为已按公开源码和离线测试核对。这里讨论一个不需要账户或 API Key 的只读命令行工具：用 Python 标准库读取服务、国家与报价，不购买号码，不触发或批量发送短信。&lt;/p&gt;

&lt;p&gt;接入 OpenAI/ChatGPT/Codex、Google 或 Telegram 等服务前，先检查目录数据是一个独立步骤；出现报价并不保证目标平台接受号码或一定收到验证码。本文只关注如何让查询结果和失败状态足够明确。&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 金额保留整数，展示时再转换
&lt;/h2&gt;

&lt;p&gt;接口的 &lt;code&gt;price_micros&lt;/code&gt; 以百万分之一美元表示金额。示例保留原整数，用 &lt;code&gt;Decimal&lt;/code&gt; 生成六位小数字符串：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;

&lt;span class="n"&gt;micros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000001&lt;/span&gt;
&lt;span class="n"&gt;price_usd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;micros&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.6f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# "1.000001"；这是测试数值，不是实时报价
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;不要先转成浮点数，也不要在排序前四舍五入到两位。很小的报价可能显示成零，随后失去比较价值。工具同时输出整数 &lt;code&gt;price_micros&lt;/code&gt; 和字符串 &lt;code&gt;price_usd&lt;/code&gt;，按整数排序。&lt;/p&gt;

&lt;p&gt;输入校验也有细节：Python 的 &lt;code&gt;bool&lt;/code&gt; 是 &lt;code&gt;int&lt;/code&gt; 的子类，因此代码用 &lt;code&gt;type(micros) is int&lt;/code&gt;，并拒绝负数、字符串和浮点报价。字段类型变化时明确报错，比悄悄转换更容易排查。&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 一次报价查询并不只有一个请求
&lt;/h2&gt;

&lt;p&gt;在仓库目录运行，需 Python 3.10 或更新版本，无第三方依赖：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python raysms_catalog.py &lt;span class="nt"&gt;--list&lt;/span&gt; services &lt;span class="nt"&gt;--lang&lt;/span&gt; zh-CN &lt;span class="nt"&gt;--limit&lt;/span&gt; 20
python raysms_catalog.py &lt;span class="nt"&gt;--service&lt;/span&gt; tg &lt;span class="nt"&gt;--format&lt;/span&gt; json &lt;span class="nt"&gt;--limit&lt;/span&gt; 10 &lt;span class="nt"&gt;--timeout&lt;/span&gt; 15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;第二条先读服务和国家目录，再读报价，共三个 GET；无效国家编号会在报价请求前被拒绝。&lt;code&gt;--limit&lt;/code&gt; 只限制输出行数，不减少接口返回的数据；设为零表示输出全部已返回的行，不会发起翻页请求。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--timeout 15&lt;/code&gt; 用于每次网络请求，不是整个程序十五秒内必然结束的承诺。工具保留默认 TLS 证书校验，并限制单个响应为 2 MiB，还会检查 JSON 结构，防止把错误页面当成空库存。&lt;/p&gt;

&lt;h2&gt;
  
  
  3. 遇到 429，先停下来
&lt;/h2&gt;

&lt;p&gt;示例收到 HTTP 429 会显示 &lt;code&gt;Retry-After&lt;/code&gt;（如果服务端提供），退出且不自动重试。网络或 TLS 失败也返回简短错误，不打印原始响应体或内部诊断内容。&lt;/p&gt;

&lt;p&gt;如果将来接入定时任务，应遵守服务端等待提示，设置有限重试次数并减少查询频率；这属于调用方需要增加的策略，当前 CLI 没有实现自动退避。查询失败也不能据此推断“某国家没有库存”。正常空结果与请求失败必须分别处理。&lt;/p&gt;

&lt;h2&gt;
  
  
  4. 先运行八项离线测试
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; unittest &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;测试替换网络调用，覆盖公开 GET 不带凭据、拒绝未知路径、微美元精度、错误金额类型、429 不重试、无效 JSON 或结构、诊断信息隐藏，以及无效国家提前停止。本轮八项均通过，但这些测试不代表实时库存或平台接受率测试。&lt;/p&gt;

&lt;p&gt;可以从 &lt;a href="https://github.com/hookunlou-create/raysms-public-catalog-example" rel="noopener noreferrer"&gt;GitHub 完整源码与测试&lt;/a&gt; 复现，也可以用 &lt;a href="https://documenter.getpostman.com/view/48588223/2sBYHSz1TP" rel="noopener noreferrer"&gt;Postman 公开只读集合&lt;/a&gt; 查看请求。更完整的字段说明见 &lt;a href="https://raysms.com/zh/guides/sms-api-python" rel="noopener noreferrer"&gt;RaySMS Python 接入指南&lt;/a&gt;。公开查询阶段无需放入任何密钥，后续涉及付费操作时，应另行设计授权与金额核验。&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>tutorial</category>
      <category>testing</category>
    </item>
    <item>
      <title>Google 把旧域名选成规范首页：UPGPT 的 301 与 canonical 排查记录</title>
      <dc:creator>UPGPT主理人</dc:creator>
      <pubDate>Tue, 20 Oct 2026 03:36:30 +0000</pubDate>
      <link>https://dev.to/upgpt-pro/google-ba-jiu-yu-ming-xuan-cheng-gui-fan-shou-ye-upgpt-de-301-yu-canonical-pai-cha-ji-lu-8bp</link>
      <guid>https://dev.to/upgpt-pro/google-ba-jiu-yu-ming-xuan-cheng-gui-fan-shou-ye-upgpt-de-301-yu-canonical-pai-cha-ji-lu-8bp</guid>
      <description>&lt;p&gt;作者：UPGPT 运营。本文使用 AI 辅助整理，依据 2026 年 10 月 20 日的实际修改和公开请求检查记录撰写。&lt;a href="https://upgpt.pro/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=organic_20261020" rel="noopener noreferrer"&gt;UPGPT&lt;/a&gt; 提供 ChatGPT 会员相关第三方服务，与 OpenAI 无隶属关系。&lt;/p&gt;

&lt;p&gt;这次记录一个多域名共用站点的排查过程：主域首页能正常打开，HTML 也声明了 canonical，但 Search Console 仍选择了旧域名。涉及 Nginx、PHP 和静态文章的不同处理路径。&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 先看 Google 选了哪个网址
&lt;/h2&gt;

&lt;p&gt;首页 URL 检查显示“重复网页，Google 选择的规范网页与用户指定的不同”。用户指定的是 &lt;code&gt;https://upgpt.pro/&lt;/code&gt;，Google 选择的是 &lt;code&gt;https://cz.hopeai.cc/&lt;/code&gt;；报告中的上次抓取时间为 10 月 12 日。&lt;/p&gt;

&lt;p&gt;这里应区分“页面可以访问”和“Google 采用了哪一份副本”。不要只检查状态码，也要记录用户声明与 Google 选择的规范网址。Google 文档把永久跳转和 canonical 都列为强信号，但并不保证照单采用。&lt;a href="https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls" rel="noopener noreferrer"&gt;规范网址说明&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 检查真正返回内容的那一层
&lt;/h2&gt;

&lt;p&gt;旧域、www 和主域共享内容。先在 PHP 入口加入公开页面跳转后，首页生效，但静态文章绕过了这个入口，仍能从旧域直接访问。&lt;/p&gt;

&lt;p&gt;因此又在 Nginx 补上规则。下面是本次使用的公开内容规则；只匹配列出的页面路径和 GET/HEAD，购买、订单、支付回调不在范围内：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$upgpt_seo_request&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$request_method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$upgpt_seo_request&lt;/span&gt; &lt;span class="p"&gt;~&lt;/span&gt; &lt;span class="sr"&gt;"^(cz[.]hopeai[.]cc|www[.]upgpt[.]pro):(GET|HEAD):(/|/blog(?:/[A-Za-z0-9_-]+)?/?|/privacy/?|/terms/?)$")&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://upgpt.pro&lt;/span&gt;&lt;span class="nv"&gt;$3$is_args$args&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;规则保留匹配路径和查询参数。这个路径白名单来自本站实际路由，不能直接当作任意网站的全站迁移配置。PHP 还处理了 &lt;code&gt;/blog/&lt;/code&gt; 到 &lt;code&gt;/blog&lt;/code&gt; 的尾斜杠规范化。&lt;/p&gt;

&lt;h2&gt;
  
  
  3. 让页面声明与链接指向同一个主域
&lt;/h2&gt;

&lt;p&gt;随后检查布局模板与单独生成的静态文章，把 canonical 固定为主域对应页面，而不是随请求 Host 改变。例如&lt;a href="https://upgpt.pro/blog/gpt-upgrade-guide?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=organic_20261020" rel="noopener noreferrer"&gt;这篇实际教程&lt;/a&gt;的声明为：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"canonical"&lt;/span&gt;
      &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://upgpt.pro/blog/gpt-upgrade-guide"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;四篇文章都检查了返回 HTML；同时修正正文链接，避免继续把读者导向旧域。带来源参数的分享链接，也与不带参数的规范网址分开处理。&lt;/p&gt;

&lt;h2&gt;
  
  
  4. 用 GET 验证，不只看浏览器地址栏
&lt;/h2&gt;

&lt;p&gt;第一轮请求关闭自动跟随跳转，查看状态码和 Location；随后访问目标，确认正常返回。这样能发现“仍是 200”“跳错路径”“参数丢失”等问题。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;检查对象&lt;/th&gt;
&lt;th&gt;本次实际结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;旧域与 www 首页&lt;/td&gt;
&lt;td&gt;301 到主域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;旧域常规文章&lt;/td&gt;
&lt;td&gt;301 到对应文章&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;www 文章带 UTM&lt;/td&gt;
&lt;td&gt;301，查询参数保留&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主域首页与四篇文章&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主域及旧域购买、订单查询页&lt;/td&gt;
&lt;td&gt;GET 仍为 200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主域 sitemap.xml&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;保存了修改前的文件和最终部署副本。这轮只验证公开请求，未真实付款或创建测试订单；因此交易流程没有得到端到端验证。&lt;/p&gt;

&lt;h2&gt;
  
  
  5. 分开记录提交、收录与流量
&lt;/h2&gt;

&lt;p&gt;Search Console 所有权验证完成后，站点地图提交显示成功，发现 6 个网址。发现网址不能等同于全部收录；Google 也说明提交 sitemap 只是提示，不保证抓取。&lt;a href="https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap" rel="noopener noreferrer"&gt;站点地图说明&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;首页单独“请求编入索引”因验证服务连接失败，没有提交成功。主教程检查显示已收录，但属于原有状态，不能计作本次新增收录。&lt;/p&gt;

&lt;p&gt;截至记录时，尚未观察到此次修改带来的新增自然搜索点击或订单。下一步应看 Google 重新抓取后的规范网址选择，再比较展现、点击和落地页数据。这个案例里最有用的排查动作，是分别检查动态入口和静态文章，而不是把首页跳转成功当作整站处理完成。&lt;/p&gt;

</description>
      <category>seo</category>
    </item>
    <item>
      <title>OpenAI、Google、Telegram 接码前，先看懂服务、报价和订单状态</title>
      <dc:creator>UPGPT主理人</dc:creator>
      <pubDate>Tue, 20 Oct 2026 03:31:55 +0000</pubDate>
      <link>https://dev.to/upgpt-pro/openai-google-telegram-jie-ma-qian-xian-kan-dong-fu-wu-bao-jie-he-ding-dan-zhuang-tai-178m</link>
      <guid>https://dev.to/upgpt-pro/openai-google-telegram-jie-ma-qian-xian-kan-dong-fu-wu-bao-jie-he-ding-dan-zhuang-tai-178m</guid>
      <description>&lt;p&gt;我在运营 RaySMS，一个可以通过网页和 API 接收短信验证码的服务。OpenAI 验证我自己日常就在使用，也已成功完成。这次想分享购买前最值得看清的三类信息：选的是什么服务、报价如何计算、订单现在到了哪一步。&lt;/p&gt;

&lt;p&gt;这篇结合 RaySMS 的实际接口，说明购买前的核对步骤，以及等待短信、取消和超时重试的处理方法。&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 先确认服务代码，再挑国家
&lt;/h2&gt;

&lt;p&gt;当前目录里，OpenAI 对应 dr，Google,youtube,Gmail 对应 go，Telegram 对应 tg。开发者可以先读取公开服务目录，再查某个服务的国家报价：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/catalog/services?lang=zh-CN
GET /api/catalog/prices?service=dr
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这两个请求不需要密钥或充值，也不会创建订单。国家字段使用目录 ID，不是电话区号；一个应用的号码，也不要直接当成另一个应用的号码使用。&lt;/p&gt;

&lt;p&gt;我把三个服务的入口和实际验证步骤整理在&lt;a href="https://raysms.com/zh/guides/openai-google-telegram-sms" rel="noopener noreferrer"&gt;中文服务选择指南&lt;/a&gt;。遇到 ChatGPT／Codex 的手机验证提示时，可以从 OpenAI（dr）目录查询号码报价，再按账户里实际出现的步骤操作。&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 小额报价也要保留精度
&lt;/h2&gt;

&lt;p&gt;API 的 price_micros 使用整数微美元：1,000,000 等于 1 美元。例如 125,000 是 0.125 美元，这只是单位换算示例，不是当前报价。展示时可用 Decimal 换算，避免浮点数和过早保留两位小数带来的偏差。&lt;/p&gt;

&lt;p&gt;报价中的 count 是当前报告的库存数量，不是成功率；查询也不会锁定库存。真正下单时会重新核对报价。请求中的 max_price_micros 表示本次接受的价格上限，超出时应重新选择，而不是由客户端悄悄提高预算。&lt;/p&gt;

&lt;h2&gt;
  
  
  3. 收到短信与完成订单，是两个状态
&lt;/h2&gt;

&lt;p&gt;购买后，在目标应用填写完整的国际格式号码，按提示申请短信，再回订单页查看。把状态区分清楚，界面和 API 集成都容易理解：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;状态&lt;/th&gt;
&lt;th&gt;怎么理解&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;waiting&lt;/td&gt;
&lt;td&gt;等待短信，继续查看原订单&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;received&lt;/td&gt;
&lt;td&gt;已收到验证码，可以读取消息；不等于目标账户已验证成功&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;finished&lt;/td&gt;
&lt;td&gt;已完成订单的结束操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cancel_pending&lt;/td&gt;
&lt;td&gt;取消结果还在确认，不能当成已退款&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cancelled&lt;/td&gt;
&lt;td&gt;已确认取消，核对钱包中的退款记录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;review&lt;/td&gt;
&lt;td&gt;结果需要人工核对，先保留原订单号&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;订单状态可通过需要认证的 GET /api/orders/{order_id} 查询。看不清结果时，把订单号和错误上下文交给客服即可，不要公开验证码或密钥。收到码后通常不能再走普通取消流程；未收码也应以订单当前允许的操作和最终确认结果为准。&lt;/p&gt;

&lt;h2&gt;
  
  
  4. 超时重试，要记住原来的购买意图
&lt;/h2&gt;

&lt;p&gt;下单使用 POST /api/orders，需要认证、价格上限和 idempotency_key。这个键应在发请求前生成并保存。同一账号重试同一笔服务和国家的购买时，沿用原键，系统会返回已有订单；更换服务或国家却复用原键，会返回冲突。&lt;/p&gt;

&lt;p&gt;如果每次网络超时都生成新键，系统看到的就是不同购买意图，可能产生新的付费订单。遇到 review，也应先查原单，不要把“没有拿到明确结果”理解成“没有购买”。&lt;/p&gt;

&lt;p&gt;可以先用&lt;a href="https://raysms.com/zh/guides/sms-api-python" rel="noopener noreferrer"&gt;只读 Python 示例&lt;/a&gt;熟悉字段，再按&lt;a href="https://raysms.com/zh/developers" rel="noopener noreferrer"&gt;开发者指南&lt;/a&gt;接入订单。网页和 API 共用美元钱包与订单记录，先把状态和金额表达清楚，后续排查会省很多时间。&lt;/p&gt;

&lt;p&gt;你更希望购买前直接看到哪项信息：国家库存、完整精度的价格，还是当前可取消的条件？欢迎反馈具体页面或字段。&lt;/p&gt;

&lt;p&gt;披露：我是 RaySMS 经营者，号码服务按需付费。本文经 AI 辅助整理，并按当前实现核对。个人使用经验不代表整体成功率，具体号码接受情况由目标平台决定。&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>api</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Reading SMS quotes for OpenAI, Google and Telegram with Python</title>
      <dc:creator>UPGPT主理人</dc:creator>
      <pubDate>Tue, 20 Oct 2026 02:47:57 +0000</pubDate>
      <link>https://dev.to/upgpt-pro/reading-sms-quotes-for-openai-google-and-telegram-with-python-11p0</link>
      <guid>https://dev.to/upgpt-pro/reading-sms-quotes-for-openai-google-and-telegram-with-python-11p0</guid>
      <description>&lt;p&gt;I operate RaySMS, a paid service for receiving SMS verification codes. If you are exploring OpenAI, ChatGPT or Codex phone checks, or Google and Telegram verification, this walkthrough starts with the part you can inspect before a purchase: service selection, available countries and current prices.&lt;/p&gt;

&lt;p&gt;My own day-to-day OpenAI verification experience has been successful. I would like to share how the RaySMS catalog and API make the service-and-country choice easier to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, distinguish a service code from a product name
&lt;/h2&gt;

&lt;p&gt;The current catalog uses these service identifiers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Catalog entry&lt;/th&gt;
&lt;th&gt;Service code&lt;/th&gt;
&lt;th&gt;What to check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The actual OpenAI phone-verification flow you need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;&lt;code&gt;go&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The account, country and verification step involved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The account and verification method shown by Telegram&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These identifiers come from the provider catalog. Re-read the catalog before using them; a listed service does not imply that any particular country currently has stock.&lt;/p&gt;

&lt;p&gt;For OpenAI, ChatGPT or Codex phone-check scenarios, use the OpenAI catalog entry (&lt;code&gt;dr&lt;/code&gt;) and check the flow you need; the target platform decides acceptance.&lt;/p&gt;

&lt;h2&gt;
  
  
  A read-only request sequence
&lt;/h2&gt;

&lt;p&gt;The example uses Python 3.10+ and the standard library. It sends three kinds of public GET requests:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;/api/catalog/services?lang=en&lt;/code&gt; returns service &lt;code&gt;code&lt;/code&gt; and &lt;code&gt;name&lt;/code&gt; fields.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/api/catalog/countries?lang=en&lt;/code&gt; returns country &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;name&lt;/code&gt; fields. An ID is a catalog identifier, not a telephone dialing prefix.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/api/catalog/prices?service=dr&lt;/code&gt; returns currently available country quotes for the selected service. Adding &lt;code&gt;country=&amp;lt;catalog ID&amp;gt;&lt;/code&gt; narrows the selection.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No API key, login cookie or wallet funding is required for these queries. The script contains no order-creation or payment request, so running it cannot purchase a number or spend wallet funds.&lt;/p&gt;

&lt;p&gt;Save the following as &lt;code&gt;raysms_catalog.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python 3.10+; standard library only. No API key is needed.
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;decimal&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib.error&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HTTPError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;URLError&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib.parse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urlopen&lt;/span&gt;

&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://raysms.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RaySMS-Catalog-Example/1.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                      &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;HTTPError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Retry-After&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;the documented interval&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;SystemExit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rate limited; retry later after &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;SystemExit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;API returned HTTP &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                         &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;; check the request and service availability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;URLError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;SystemExit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Network request failed; check connectivity and retry later&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;UnicodeError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;SystemExit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;API response was not valid JSON&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;SystemExit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unexpected API response; inspect the API documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Read the RaySMS catalog; never buy numbers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Service code from the catalog, for example tg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--country&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Optional country ID from the catalog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog/services&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;countries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog/countries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Services (first 20):&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Countries (first 10):&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
        &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown service code; run without arguments to inspect the catalog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown country ID; inspect the country catalog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;offers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog/prices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;offers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No available offers for this selection. No purchase was made.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;offer&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price_micros&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))[:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price_micros&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nc"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1000000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;country&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USD &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.6f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Run it for the three service entries
&lt;/h2&gt;

&lt;p&gt;Start with the catalog. The program prints the first 20 services and first 10 countries; it still validates your selection against the full returned catalogs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python raysms_catalog.py
python raysms_catalog.py &lt;span class="nt"&gt;--service&lt;/span&gt; dr
python raysms_catalog.py &lt;span class="nt"&gt;--service&lt;/span&gt; go
python raysms_catalog.py &lt;span class="nt"&gt;--service&lt;/span&gt; tg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To query one country, append &lt;code&gt;--country&lt;/code&gt; and an actual ID returned by the country catalog. Do not substitute a phone prefix or country name. The service codes above are the current mapping, not a promise that all three queries will have available offers when you run them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the money and availability fields correctly
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;price_micros&lt;/code&gt; is an integer amount in millionths of a US dollar: 1,000,000 units equals USD 1. The example converts it with &lt;code&gt;Decimal&lt;/code&gt; and prints six decimal places. This avoids introducing binary floating-point rounding into the displayed quote.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;count&lt;/code&gt; is the available quantity reported for that quote. It is not a delivery-success count. An empty &lt;code&gt;items&lt;/code&gt; list means that this selection currently has no offers; reading a quote does not reserve a number. Different service-and-country combinations can have different prices and available quantities.&lt;/p&gt;

&lt;p&gt;Availability, price and acceptance are separate checks. A returned quote establishes what the catalog reports at that moment. It does not prove that a later purchase will succeed or that OpenAI, Google or Telegram will accept that number and deliver a message. Use a number only where the target service permits its type and your intended use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat failures as a reason to pause
&lt;/h2&gt;

&lt;p&gt;The request has a 15-second timeout. On HTTP 429, the script reports &lt;code&gt;Retry-After&lt;/code&gt; when supplied and exits. It also exits on a network error, non-JSON response or unexpected response envelope. There is no automatic retry loop.&lt;/p&gt;

&lt;p&gt;That makes the example deliberately limited: it is a catalog explorer, not a production purchase worker. If you later implement purchasing, add authentication, a price ceiling and an idempotency key for each intended purchase. An ambiguous provider outcome should lead you to inspect the original order, not silently create another paid order. The developer guide covers that separate workflow:&lt;br&gt;
&lt;a href="https://raysms.com/en/developers" rel="noopener noreferrer"&gt;https://raysms.com/en/developers&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the dashboard fits
&lt;/h2&gt;

&lt;p&gt;RaySMS offers a web dashboard and API backed by an upstream number provider, a shared USD wallet and order history, four interface languages, registration email verification, and optional authenticator-based two-factor authentication. Payment options appear according to the channels enabled on the site.&lt;/p&gt;

&lt;p&gt;The number service is paid; this example is a free catalog query. Check the service and country before ordering. Cancellation eligibility depends on order state and provider confirmation.&lt;/p&gt;

&lt;p&gt;Full Python guide: &lt;a href="https://raysms.com/en/guides/sms-api-python" rel="noopener noreferrer"&gt;https://raysms.com/en/guides/sms-api-python&lt;/a&gt;&lt;br&gt;
Service overview: &lt;a href="https://raysms.com/en/" rel="noopener noreferrer"&gt;https://raysms.com/en/&lt;/a&gt;&lt;br&gt;
Payment guide: &lt;a href="https://raysms.com/en/guides/pricing-payments" rel="noopener noreferrer"&gt;https://raysms.com/en/guides/pricing-payments&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Which part would you want documented more explicitly before adding a paid order call: country selection, quote precision, or ambiguous order states?&lt;/p&gt;

&lt;p&gt;Disclosure: I operate RaySMS. This article was drafted with AI assistance and checked against the current implementation.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>python</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>没有海外 Visa，如何升级 ChatGPT Plus / Pro？一份安全检查清单</title>
      <dc:creator>UPGPT主理人</dc:creator>
      <pubDate>Tue, 14 Jul 2026 11:17:02 +0000</pubDate>
      <link>https://dev.to/upgpt-pro/mei-you-hai-wai-visaru-he-sheng-ji-chatgpt-plus-pro-fen-an-quan-jian-cha-qing-dan-3o49</link>
      <guid>https://dev.to/upgpt-pro/mei-you-hai-wai-visaru-he-sheng-ji-chatgpt-plus-pro-fen-an-quan-jian-cha-qing-dan-3o49</guid>
      <description>&lt;h1&gt;
  
  
  没有海外 Visa，如何升级 ChatGPT Plus / Pro？
&lt;/h1&gt;

&lt;p&gt;国内用户订阅 ChatGPT Plus 或 Pro，真正容易卡住的往往不是模型怎么用，而是支付：没有海外 Visa / Mastercard、账单地址验证失败，或者不熟悉官方订阅页面。&lt;/p&gt;

&lt;p&gt;如果你选择第三方自助升级服务，建议先弄清楚三个问题：升级的是不是自己的原账号、当前会员是否会被覆盖、需要提交的信息有多敏感。&lt;/p&gt;

&lt;h2&gt;
  
  
  三种套餐如何选择
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;套餐&lt;/th&gt;
&lt;th&gt;适用场景&lt;/th&gt;
&lt;th&gt;UPGPT 当前参考价&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT Plus&lt;/td&gt;
&lt;td&gt;日常对话、办公、学习和轻度开发&lt;/td&gt;
&lt;td&gt;¥188 / 月&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT Pro 5X&lt;/td&gt;
&lt;td&gt;高频对话、专业开发、深度研究和较长任务&lt;/td&gt;
&lt;td&gt;¥888 / 月&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT Pro 20X&lt;/td&gt;
&lt;td&gt;重度 Codex、研究和复杂长任务&lt;/td&gt;
&lt;td&gt;¥1,588 / 月&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;价格和套餐可能随时调整，请以 &lt;a href="https://upgpt.pro/#pricing" rel="noopener noreferrer"&gt;UPGPT 套餐页面&lt;/a&gt; 为准。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzyp6yxfyf9ula70wfli3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzyp6yxfyf9ula70wfli3.png" alt="UPGPT 套餐页面" width="800" height="991"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  自助升级的四个步骤
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;从 &lt;a href="https://upgpt.pro" rel="noopener noreferrer"&gt;UPGPT 官网&lt;/a&gt; 选择 Plus、Pro 5X 或 Pro 20X。&lt;/li&gt;
&lt;li&gt;填写用于查询订单的联系方式，通过支付宝或微信付款。&lt;/li&gt;
&lt;li&gt;在付款后的订单专属页面，按提示提交本次处理所需的账户授权信息。&lt;/li&gt;
&lt;li&gt;等待系统处理，通常 3–5 分钟；完成后刷新 ChatGPT 确认套餐状态。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  下单前必须检查
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;这是原账号升级，不是共享账号。&lt;/li&gt;
&lt;li&gt;所有套餐均为覆盖式充值，现有会员未到期也可能被覆盖。&lt;/li&gt;
&lt;li&gt;账户授权信息的敏感程度等同登录凭据，只能在从 &lt;code&gt;upgpt.pro&lt;/code&gt; 进入的订单专属页面提交。&lt;/li&gt;
&lt;li&gt;不要通过微信、QQ、邮件或群聊转发授权信息，也不要发布包含授权信息的截图。&lt;/li&gt;
&lt;li&gt;UPGPT 是独立第三方平台，并非 OpenAI 官方网站。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;完整图文步骤可以查看：&lt;a href="https://github.com/hookunlou-create/chatgpt-pro-plus-upgrade-guide" rel="noopener noreferrer"&gt;2026 ChatGPT Plus / Pro 自助升级教程&lt;/a&gt;。&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
