当您准备像编程随想那样工作…:须知

from: https://iyouport.substack.com/p/46b

安全问题不是纯粹的技术问题。对安全的普遍误解导致了很多难以被察觉的安全漏洞。这些漏洞可能没有简单的 “补丁”。

【注】如果文中导图看不清楚,请右键选择 “新建标签页打开”。或者,您可以在这里下载

失踪已久的前著名华语博主 “编程随想”,于近日终于有了比较确切的消息 — — 正如很多人所担心的那样,失踪意味着发生了糟糕的事,他被捕了,而且还被判了刑。

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca272f7-1cc8-49fe-9561-5553b433fb6f_896x936.png

如果此时有任何人感觉到自己的头脑中充满了安全性虚无主义的噪音,请不要自责,这是正常的。“专家都被抓到了,我等菜鸟还能幻想什么” ……

但这样想至少毫无作用。

因为,安全问题不是纯粹的技术问题,就如安全这个词本身所描述的东西一样,它是一个系统,一种状态;于是它的结果取决于协调性,而非其中某个/或某几个部分的专业性。

同时,不幸的是,局部的专业性过高有可能降低(而不是提升)整体的协调性。

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c6b093f-03e5-4ccb-b4d4-e9cdfa6a5558_2062x1360.png

本文不是文章,只是一个帖子。它可能非常不完整(毕竟没有卷宗可查);但也许可以补充一些编程随想博客可能没有涉及的内容。此外我们也正在准备一本书,希望能更详细地讲述安全这个问题。

在收到起诉书全文之前,我们发布了一个帖子如下。大概需要解释一下:起诉书只能确认判决事件,但起诉书中所描述的侦查细节,建议谨慎取信。对刑侦过程/手段的调查,是另一项任务 —— 是更重要的任务,对所有政治犯的案件来说都是如此,不论当事人最终有没有被起诉。

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23be58fc-6d57-4228-b52b-4105fd2b54b6_1200x835.png

关于最普遍的安全漏洞

在安全方面,中国的前线工作者有两个方面的弱点,比较严重:

—— 第1个弱点:对对手的了解不足 ——

您肯定知道 “知己知彼” 这一重要的战术智慧。您的对手拥有巨大的特权、充足的预算、无下限的卑劣,以做到长期、持续、深入地了解您,甚至可以预测您的行为。而您对他们了解多少呢?

这里存在一个严重的不平衡。您在明,他们在暗。

缺少的可能不是吹哨调查,而是满足前线社区反抗战略的吹哨和调查。这至关重要。

我们对此的弥补方案,是努力分析其他国家的镇压手段(内容在 列表-​5 “维稳面面观” 、以及 “反抗者寻求经验” 中)。鉴于统治者所拥有的基础设施大同小异,这可以有所帮助,但肯定不充分,前线工作者需要了解对手在什么样的情况下倾向于怎么做。

如此,您便既可以 “制造” 某种情况,以引诱对手那样去做,也可以避免某种情况的发生,以改变事态走向;甚至还有可能从中了解到对手可能的漏洞,以利用来维护自己的安全。

在其他很多国家,反对派组织是很擅长做这类事的,他们在努力保护自己的秘密的同时,揭开对手的秘密。这也正是 “较量” 这个词所描述的意思。

举个例子:您知道自己在什么情况下会被监视锁定吗?—— 我指的是刑侦中的监视工作,您知道被锁定的人会经历什么吗?监视者的目的是什么?他们的工作流程是什么?……

我来画一个图,以最简化的方法描述俄罗斯镇压机构是如何做这件事的。在您的国家它应该大同小异:

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d15f11b-9c04-4aac-b52a-a1669bc1a05f_1200x707.png

您能画一个中国版吗?

不必画给我。只给那些与您实际合作的亲密队友。知情对你们来说至关重要。

以上只是一个例子。您需要知道的东西挺多的。请保持战略目标的清晰。

—— 第2个弱点:孤独 ——

孤独是巨大的安全隐患。

令您深陷孤立无援的恐慌,是您的对手始终致力于采取的镇压策略。

人们被渗透和出卖的故事吓坏了。很多担忧是有道理的,但仅仅担忧就没有道理了,因为它只会起到反作用。当您草木皆兵加倍孤单的时候,就是您的对手可以对您最随心所欲的时候。

(我们有过很多关于如何抵制渗透的技巧介绍,比如这里这里这里、还有这里

您需要至少一位贴心战友 —— 更好的是 亲密团队

阮先生的案件之所以变得 “疑点重重”,甚至一大群人因为猜想而发生争执,正是因为阮先生对紧急状况的准备似乎严重不足 —— 这绝不是额外的工作,它就是 “安全” 工作本身的重要部分!

这一 “准备” 工作应该至少包括以下4个步骤:

  1. 明确威胁环境;

  2. 明确您最需要的帮助;

  3. 确定至少一位贴心战友 —— 作为紧急联络人,至关重要!

  4. 准备具体的材料。

下面的图片分别解释了这4个步骤包括什么:

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fca6da3-0e76-4db4-9853-6a5b19f9987c_1200x406.png

第1步

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ab790ce-a344-4d5a-b2ff-dccac47d7819_1200x621.png

第2步

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F176443b6-e759-4dfe-b8bb-4478230f5c16_1200x798.png

第3步

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ef9f5b-e748-4308-bbe3-5cce2b8b0f4f_1200x1170.png

第4步

上述这4个步骤是您最基本应该做的!甚至,不论您是否如阮先生那样去工作,只要您生活在警察国家,并认为自己有遭受迫害的可能性,您就应该提前做这些训练和准备工作。

此案评论中显示出人们对 “安全” 可能存在的误会

1

老读者知道,我们提供过很多安全教程,试图从各方面讲述安全性;这些 “方面” 彼此嵌套,或互为条件,或互相支撑。并没有谁比谁更重要,但它们在不同计划/项目中、在不同程度上,缺一不可。

安全是一套思考方式。它既不是哪些软硬件、也不是某些配置,因为没有任何软硬件和配置能独自决定安全性 — — 它们都只是战术,而安全是这些战术经过有效部署以恰当的方式结合在一起时,所产生的效果。

反过来说,如果它们的组合不恰当,不论是过度还是不足,都会形成安全漏洞。

阮先生的起诉书中出现的细节 — — 比如小米手机、华为笔记本等等 — — 也许会让一些读者觉得 “抓住了要点”,其实所有这些都可能不是要点。

这并不意味着鼓励您去购买哪款手机或电脑;什么对您好什么不好,始终取决于您准备做什么,以什么角色来做。

我们也写过诸如《一句话安全须知》这样的 “通用” 安全性教程,但防御工作,绝对没有那么简单。

不幸的是,大多数人可能对软硬件评测头头是道,对配置如数家珍,但却不擅长或经常忘记评估恰当性。

工具很重要,没错,它们提供“能力”给您。但这份能力用来做什么,如何搭配这些不同的能力,取决于您合理的战术布局。

合理的战术布局 = 有一个明确的战略目标 + 准确的威胁模型和风险评估 + 了解不同战术的特征和能力。

所以,如果您关心安全知识,并且现在是第一次阅读IYP的内容,我推荐您从《整体安全》教程开始(此链接是最后一集内容,其中有该系列完整列表)。

这是一个训练营,包含您在安全方面所必须了解的一切基本原理。技术始终在不断升级 ,但防御的原理是不变的。

该训练营可以帮您培养一种持续稳定的敏锐,帮助您及时规避风险。

安全就像一棵树,软硬件是小树枝和树叶,而根基是您的战略智慧。

“最好的” = 最合理的和最恰当的,绝对不是 “最贵的和最麻烦的”。

安全就像鞋子,好不好取决于是否适合您的脚,而不是它看起来有多漂亮、花了多少钱、或者有多复杂。

一般情况下人们习惯于假设讲述数字安全知识的人最擅长数字安全操作。也许是这样。但一个人在现实中具体如何操作,起决定性作用的肯定不只有他/她的知识,更多是他/她那一刻的心理状况、情绪状态、经济状况,以及其他很多外部条件。

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F306d5122-28ca-4c8e-9b5b-227d336fe90d_1200x609.png

再来分别看这三个部分:

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4302d8f2-d750-4383-8fad-49ff81ea9424_1200x1010.png

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c251bc3-195c-4f05-a0cc-c3127ece091a_1200x946.png

近日还传出疑似中国的威胁行为者利用虚拟机的零日漏洞的报告。社交媒体上有用户将此消息关联到阮先生的被捕事件上,怀疑他被恶意软件击中了。

的确,全球大国都在囤积零日漏洞;这是21世纪最危险的武器。但您是否会遭遇零日武器,始终取决于您的角色和您的具体工作 —— 即,您最可能面对什么样的威胁者,61398部队与公安部和国安部,是肯定不同的。请记得,您的对手的武器库中 “有什么”,只是一方面,更重要的另一方面是,您的对手是等级森严的官僚机构,他们采取什么做法是有标准的和需要上级批准的。(虽然如今 “私人镇压雇佣兵公司” 之类的东西也开始出现,值得警惕。因为这些人是流氓,几乎没有约束。)

对于虚拟机零日来说,作为异议人士您不必太过担心。因为,首先,您不应该完全彻底地信任任何一款软件能百分百安全 —— 不论是Tor还是qubes OS还是其他虚拟机。漏洞是政治性的,而不只是技术问题,这就是为什么它永远都 “补” 不完。其次,隔离风险的第一层屏障,应该在您的头脑中,而不是在虚拟机里 —— 您应该培养一种安全性直觉,将安全操作纳入习惯 —— 就像饭前洗手那样,不需要特意的记忆,也会主动去做,主动拒绝无法完全信任的信息

如果您只是专注于国家级APT组织的最新能力,就有可能陷入安全性虚无主义。那是没有必要的。

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc86edd33-18c4-4fa8-84b9-37df32fc7957_1200x1063.png

阮先生的文章中提供的安全建议大多是结论。对于安全知识的初学者来说,这有可能造成一些误会,认为只要完全照着做就行了。并不是的。如果您在阅读后没有进行分析,那对于阮先生的工作来说是一种浪费。

2

分身只是把敏感的那部分隔离出去就行了吗?当然不是。

如果就像目前公开的消息所言,阮先生的真实身份就是网络安全工程师,那么 “编程随想” 这个身份就并没有实现真正的分身隔离;因为 —— 分身的要诀在于,分离出来的每一种身份之间都是完全不同的,尤其是,没·有·任·何·交·集,必须让每一个身份看起来·完·全·独·立,这样才能切断追踪线索。

阮先生在数字安全方面下了很多功夫,很专业。但战术布局规划方面的技巧至少在博文中的体现不多。

准确评估风险、并掌握安全使用各种类型的在线身份所需的技术技能,至关重要。

关于战术布局,我们以在线身份管理为例,演示下应该建议您如何思考 ——

在观看下图之前,希望您的头脑中已经有了一个关于您马上准备去做什么的尽可能具体的想法,这样您可以更有代入感,更容易举一反三地使用它来为自己的安全部署进行计划。如果您还没有任何想法,那么可以把自己想象成阮先生:

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7dc68737-283e-41c9-8b7b-293bae825a59_1200x577.png

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcac5b100-c263-4b64-9ba7-bc74f7c769c3_1200x497.png

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c1a2230-6bbb-4f2a-81a6-3653a7ca7f63_1200x1050.png

就像所有的安全和隐私策略及工具一样,当您没有面临直接的威胁时,您会更好地学习熟练使用这些防御措施。压力会影响您参与风险分析、安全规划和技能培养的系统化过程的能力。

所以,把安全措施作为习惯,而不是救急,才最有希望获得安全。

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad9f6f70-bb37-47ad-932b-e94eb81985e4_1200x837.png

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78d6b340-3027-430b-aec7-889bf4832cf7_1200x969.png

您的战术布局应该致力于减轻/减缓脆弱性、增加复原力,而不是寻找 “完全避免风险” 的方案。并没有那样的方案。

减轻/减缓脆弱性的方法,比如,一个分身只做一两件事;完成后彻底摧毁。以及,您不可能完全避免风险,但您可以分散风险/分散敌方火力…… 您知道该怎么做。

还有更多。我想留给您去思考。这些是阮先生可能没有留给您的。

3

完整的 “安全” 措施,必须包含充分的自我评估,和假设所有防御都失败时的Plan B。这也是阮先生可能没有做到的。

所有灾难都不是瞬间的突发 —— 威胁在一步步逼近,或长或短,但肯定有一个过程。而最终,这场灾难是否对您产生破坏性、多大的破坏性,取决于您是否及时察觉到步步逼近的威胁,以及您的反应是否机智。

我们称之为 “态势感知”。您可以在 “在灾难中幸存” 那个系列中看到对此的详细解说(同样的,这里是最后一集的链接,其中包含完整列表)。

(此处建议您回顾上文中描述FSB刑侦流程的那张图)

阮先生如果对自身的评估足够准确,并对环境事态足够敏锐,他应该能察觉到威胁,并准备好 Plan B。如果他这样做了,现在的一切胡乱猜测都将不会存在。

自我评估是确立最恰当的防御设施的基础,您应该尽可能准确地描述自身能力和脆弱性

  • 能力 = 有助于使您更安全地抵御特定的威胁的因素(即 降低其可能性或影响)

  • 脆弱性 = 会使您更容易受到威胁(即 增加了威胁的可能性或影响)

这里有一个公式,您需要记住:

风险 = 威胁 ✖️弱势 ➗ 能力

威胁指的是您的对手所采取的任何手段以试图让您相信他们将不惜一切代价阻止您。

弱势指的是,您知道在那些威胁面前,您自身有哪些弱点(这是需要弥补的部分)。

值得指出的是,可能与很多朋友的认识相反,使用假名或者匿名工作在这里应该被列为 “弱势”,而不是“能力”。

因为,首先,假名或匿名意味着,人们知道您做的那些事,但不知道您的名字和身份,于是当局就有可能趁机栽赃给您的真实身份以其他罪名,而否认您是因政治原因而遭受迫害。

其次,如果您没有隶属于一个强大的组织,在您被强迫失踪的情况下,营救的希望将非常渺茫。

这就是为什么您必须有 PlanB 和紧急措施!匿名工作者孤军奋战是不可取的!具体做法见全文中的导图 —— 那4个步骤。

为了使用上面这个公式,我们先来确定几个定义:风险、威胁、能力、弱势。

1、风险 — — 指发生伤害事件的可能性;

2、威胁 — — 有意图对您造成损伤、处罚或者伤害的声明或者迹象(近期的或当即的);

3、能力 — — 可提高安全保障的任何资源(包括自身能力、人脉关系、可用的环境条件等);

4、弱势 — — 很可能直接造成或导致更大伤害的一切因素。

这里的施害者可能包括:政府、警察、间谍机构、大公司、利益集团的雇佣打手、极端保守派社区、严重误解您的事业和偏好的家属/父母,等等。

下面我来演示一下这件事该怎么做。以阮先生为例,请注意,目前为止我们对阮先生的现实生活依然一无所知,于是下图只演示这一评估的思考框架,其中所标注的具体事项完全是猜测的,它们只为体现做法,并非分析。

这一框架非常简单,只有4个部分,但是,您必须保持足够的谦逊和诚实,尽可能清晰且详细地描述,才能帮您制定更准确的防御策略:

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe35675bf-bdbd-488d-b364-f0d0ddb84d90_1200x579.png

先看右侧

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c19d03d-5543-433d-b763-826095594598_1200x783.png

再看左侧

https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70427ff0-7257-4fee-a251-2f7711c36fbe_1200x1103.png

措施

4

难度越大、越复杂,防御效果越好吗?绝对不是。

并不是说复杂的技术有任何问题 —— 请不要仅仅从技术逻辑上考虑 —— 复杂繁琐的解决方案不应该作为首选是因为,它们会让您难以长时间坚持住,您稍微一疲劳,就可能出错。在安全问题上,您出错的机会很可能只有一次。尤其是在您已经被镇压当局视为一个 “肥美多汁的大鱼” 的情况下。

真正的安全效果出现在您游刃有余的情况下。闭着眼就能做对的情况下。所以,它必须足够简单,需要特别记忆的东西越少越好!

曾经有读者询问如何追踪加密货币(我们介绍过相关知识),以测试隐私程度。但必须说,加密货币安全性是一个更为复杂的领域,在基本数字安全基础之上还有很多额外的知识。马上学是来不及的。如果您不擅长这个领域,那就不要在最重要的/或者可能最危险的工作上选择加密货币。

换句话说,建议选取您容易上手的解决方案,而不是紧急学习新的复杂的技能。因为熟练操作,是最基本的安全保障。

当然肯定要鼓励您学习新的更好的技能,但是,要在您感觉安全的环境中、在您没有压力的情况下,慢慢学习,而不是在火烧眉毛的情况下临时照着教程画虎。

不管怎样,我们始终应该致力于实现隐私作为基本人权的标准。这意味着要追求只需很少的操作习惯调整,就能大幅提高安全水平的解决方案。因为人权必须是普遍的,而不是高技术技能掌握者的特权。

必须承认,数字技术有点门槛。很多需求者对网络上形形色色的安全建议的态度比较盲目,很难自行判断它们的恰当性和准确性。于是搜索排名就变得更危险了。这更需要安全建议提供者保持诚实!拿钱写软文的人,如果您觉得自己必须做这行,那么就去写一些牙膏袜子的软文吧,请不要涉及药品和软硬件,这是有可能危及生命的领域。

不论您是否擅长数字技术,建议您记得这个基本原理:少即是多。您下载的东西越少,您的攻击面就越小。完全没有必要把其他人推荐的 “好东西” 全装上,那样做只能是累赘,反而令您更危险。

再一次强调,对抗性思考方式至关重要!反追踪的最好方法就是,用追踪者的思考方式来检查自己。

最后

本案引起的所有猜想都是不必要的,不论其有没有或提供了多少证据。

它最初是一个强迫失踪案件,之后是一个政治审查案件。对于强迫失踪,这在全世界都是难题 —— 最终判刑的结果已经是其中 “最好的” 一种了,更糟的和并不罕见的是:暗杀。这就是为什么需要不断强调联合和互助,绝不鼓励单枪匹马。尤其是当您匿名工作时,单枪匹马是致命的!

看到一些读者在交流此事时倾向于认为警方 “抓错人了”。希望真正的博主没有被捕的那种心情可以理解,但是这会起到反作用 —— 它相当于承认 “对的那个人应该被抓”。不,没有任何人应该因发表评论而被判刑。阮先生究竟是不是 “编程随想本人”,没有那么重要,这里重要的是对政治异议言论的入罪。我们认为将此作为辩护方向,将是对 “编程随想本人” 的尊重。

当然,辩护方向由律师掌握,家属意见将作为重要参考,而不是公众舆论。

再一次,我们希望此案能提醒更多人对安全性的重视(而不是虚无主义),对安全作为一个系统的理解,体悟战术布局的智慧,未来更少出现这类事故。

编程随想被判刑?



2023年3月22日,网络开始流传著名匿名博客”网络随想“被中国上海判刑7年并遭遇不公正法律过程对待。随后引起网络上广泛的讨论和辩论,究竟被判刑的阮晓寰先生是否是真正“编程随想”,目前仍然没有结论,而官方的判决书也没有任何清晰的表述,让本案更加扑朔迷离。

iYouPort 认为:
- 判决书中是否指认了被告的身份为 “博主编程随想”?是如何指认的? 尤其是:此案的刑侦过程,将对未来的前线工作者数字安全防御部署策略的更新,具有重要的指导作用。 目前为止,我看到的相关信息很可能并不比您多。是的,这里有很多信息空白,以至于难以形成逻辑链。

- 网络上流传的追踪/去匿名化过程和细节 - 对于“编程随想”在数字安全方面的专业性水平来说 - 居然如此简陋,是令人震惊的和不可思议的。



所指的“简陋”是指“编程随想”曾经非常自信的隐匿经验:“为啥朝廷总抓不到俺——十年反党活动的安全经验汇总 ”,与判决书中大致形容的他完全不符合。如果被判刑的阮晓寰先生是真正的“编程随想”,那么他自己根本就没有实践自己的经验,完全是纸上谈兵。例如,如果他在本地使用Linux,而且做了硬盘加密,就不可能被官方轻易取证,在他的本地硬盘发现博客的所谓.XML备份文件。而是否他的博客是编程随想的博客地址:https://program-think.blogspot.com 更是语焉不详。

另外的问题是为何官方不能胁迫或者控制其博客,然后关闭或删除其内容?有人认为阮晓寰在紧急情况下已经销毁了两步认证的Key-file(例如authenticator),既然销毁,就可以销毁任何其他数字证据,这种不完整的做法显然不是一个安全专家的作为。而且,如果当局无法直接获得控制,其他手段还是可以行使的,或者在判决书中提及此问题,增加对其处罚的力度。

总之,诸多疑点,靠简单的推理无法得到答案。如果中本聪在世,恐怕也不会有比特币了,这正是他更加聪明之处。而推友所设想的GP(rogram)T(hink) ,也有可能让编程随想的精神延续久远:“我正在收集他的所有博文和网友问答,准备用Alpaca 做个ProgramthinkGPT,让编程随想数字永生。


至于阮晓寰先生所遭遇的不公正对待,当然值得公众关注,任何类似的指控和判决都是违反中国宪法的。希望律师和民间的努力让阮先生能够有机会健康走出监狱,告知大众真相。

最后,提醒各位,注意上网安全,尤其不要在微信讨论此事件,记住你的周围就是渔网。

ChatGPT 快捷指令

from: https://github.com/rockbenben/ChatGPT-Shortcut

ChatGPT Shortcut 是根据领域和功能划分的 ChatGPT 快捷指令表,可通过标签筛选、关键词搜索和一键复制来使用提示词,旨在简化你的工作流程并提高生产力。即使是初学者,你只需复制提示词,稍加修改后发送给 ChatGPT,就能获得指定输出,让你的生产力加倍!

提示词(即 Prompt)通常是用户提供的问题或文本,以激活模型生成回复。简单来说,prompt 就是用户想要询问的内容,作为输入送到 ChatGPT 中,ChatGPT 会尝试理解这个输入,然后输出合适的回答或响应。通过优化提示词,可以使 ChatGPT 生成更加准确、有用的回复。ChatGPT Shortcut 页面上的提示词来自网络精选、投稿和 Awesome ChatGPT Prompts,定期更新。如需自定义提示词,可以参考 ChatGPT Shortcut 和 ChatGPT Prompt Examples 进行调整,同时也欢迎投稿

开箱即用:https://newzone.top/chatgpt/

使用说明

ChatGPT Shortcut 页面默认显示全部的提示词,页面分为标签区、搜索区和提示词展示区。

image

🏷︎ 标签筛选

标签区按提示词的领域和功能进行划分,可根据不同场景和需求进行选择。与标签区右上方的「标签筛选规则切换」按钮配合使用,可进行多标签筛选。默认状态为 OR,即选中标签下的所有提示词。切换到 AND 后,将筛选出具备已选中的多个标签的提示词。

image

mag 关键词搜索

关键词搜索范围包括提示词的标题、简介、内容和中文翻译。输入关键词后,提示词展示区将立即展示筛选出的内容。如果已选中标签,则关键词搜索仅限于标签筛选范围内。

image

microscope 展示区复制

通过标签筛选和关键词搜索,点击卡片右上方的「复制」按钮即可获取提示词,将其粘贴到 ChatGPT 中,参考中文提示调整需求文本,即可得到指定领域的回复。如果提示词中的中文备注没有解释清楚,可以点击提示词的绿色标题查看来源网页。

image

speech_balloon 语言切换

默认情况下,提示词内容会显示为英文。如果你想查看中文释义,可以点击提示词内容将其切换到中文,再次点击即可切回英文。请注意,语言切换只在文字上点击有效,点击空白区域无效。

中英文切换

如果想让提示词默认显示为中文,你可以点击导航栏右侧的 CN 按钮。需要注意的是,即使切换到中文翻译,复制按钮也仅针对英文提示词复制。下方会有解释原因。

thinking 常见问题

为什么提示词用英文?

ChatGPT Shortcut 是为方便中文母语人士使用 ChatGPT 而创建的,但是提示词却全部是英文。这是因为相较于中文,ChatGPT 对英文的理解更为出色。即使是国内第一个对话式大型语言模型 MOSS,也承认 MOSS 的英文回答水平比中文高,建议使用英文。(MOSS 已不对外开放)

使用中文提示词可能会得到不错的结果,但是当你再次输入相同的中文提示时,结果可能与之前大相径庭。因为 ChatGPT 对中文的理解每次都不同,所以建议大家在生产力型提示词的输入中使用英文提示词,以保证输出效果。此外,英文提示词带来的回复也很可能是英文的,你可以在提示词结尾添加 respond in Chinese,将回复指定为中文。

搜索无法输入中文

搜索功能基于 Docusaurus 的 showcase,因此存在与其相同的 bug。移动端支持中文输入,而 PC 端使用中文输入法会丢失焦点,需通过复制中文关键词来解决,或者使用浏览器自带的全文搜索功能。一般情况下,建议使用英文搜索。已将该问题提交给 Docusaurus,正在等待修复。目前对方的回复是尝试修复 FWIW, you should not be using Chinese anyway, since the showcase is not localized

输出虚假信息

ChatGPT 虽然非常强大,但并不是万能的。有时它会输出虚假信息。例如,当我需要将上百条信息录入到 ChatGPT Shortcut 中时,我让 ChatGPT 按指定格式转换数据。但是在转换过程中,我发现其中一些信息被 ChatGPT 误写。例如,在文本中一条标签是 movie critic,而 ChatGPT 将其更改为 film critic。尽管这在文本中不会造成什么影响,但放在代码中会报错。因此,在使用 ChatGPT 时,务必检查其输出内容。

提示词不好用

所有提示词均来自互联网,会定期进行更新。虽然我测试过每一条提示词,但实际效果可能因需求而有所偏差。如果你发现任何错误、有创意的想法或有好的提示词,欢迎反馈和投稿

利用 GitHubPoster 和 GitHub Actions 备份任意用户推特

来自: https://github.com/yihong0618/gitblog/issues/252

完全不用登陆,不用申请开发者,备份任意非锁推推特用户的所有推特

为什么用 Github Actions

  1. 不用全局梯子
  2. 不需要考虑翻墙软件的 ssl 问题
  3. 方便且不用考虑本地环境配置问题

注意

How to? 只需要几个步骤,具体可以参考图片

  1. fork or clone GitHubPoster
  2. enable GitHub Actions
  3. 找到如下图的的 Twitter Back Up
  4. 点击 Run workflow
  5. 输入推友的 twitter name 点击绿色的 Run workflow
  6. 等待 Actions 跑完
  7. 所有推特备份记录在 OUT_FOLDER/${twitter_user_name}.txt 中,大家可以自己备份分享,还有个展示的 svg
  8. 如果遇到 permission deny 情况可以参考这个 issue
  1. remote: Permission to git denied to github-actions[bot]. ad-m/github-push-action#96 打开写的权限

image

例 Action workflow

https://github.com/yihong0618/GitHubPoster/actions/runs/3503844462/jobs/5869157102

注意

  1. 鉴于推特这些天的情况,这个可能随时不好用,我不会持续更新
  2. 锁推用户无法备份,如果你锁推并且想备份自己的可以先开锁,等备份完成后再锁
  3. 如果你想备份自己的又不想给别人看,可以把项目设成私有的,一样可以跑 Actions
  4. 不会回答太多问题

下图为 @frostming 的推特演示

image

image

Enjoy it

解决 OpenAI 和 ChatGPT 的 API 无法访问的问题

来自: https://github.com/noobnooc/noobnooc/discussions/9

事实证明 ChatGPT 是足够火爆的,火爆到什么程度呢,其 API 一经推出便获得了 GFW 的认证。在 Twitter 上看到很多人都在为解决无法正常访问 OpenAI 的 API 而苦恼,最常见解决方案是使用一台服务器来进行反向代理,但这样又徒增了一些成本。因为之前在公司的业务上遇到过类似问题,当时老板找到了一个还不错的几乎零成本解决方案,试了一下现在仍然可以用来解决 OpenAI 的 API 无法访问的问题,所以在这里推荐给大家。

该方案的主要思路是使用 Cloudflare 的 Workers 来代理 OpenAI 的 API 地址,配合自己的域名即可在境内实现访问。因为 Cloudflare Workers 有每天免费 10 万次的请求额度,也有可以免费注册的域名,所以几乎可以说是零成本。而且该方法理论上支持所有被认证的网站,而不只是 OpenAI。

使用这个方案需要你有以下东西:

  • 一个没有被 GFW 认证的域名(没有的话也可以到 https://www.freenom.com 免费注册一个,26a0.png
    据推友提醒,freenom 已暂停新用户注册,但相信对于大家来说注册域名不是啥大问题)
  • 一个 Cloudflare 账号(当然也可以现注册)

26a0.png
请不要直接使用本教程示例中的地址,因为随时会被关闭。也不要使用任何其他人搭建的不受信任的地址,因为有 api key 被盗取的可能。

太长不看

  1. 新建一个 Cloudflare Worker
  2.  https://gist.github.com/noobnooc/d0407b5fb81cff9d36f981170b99d4e6 里的代码粘贴到 Worker 中并部署
  3. 给 Worker 绑定一个没有被 GFW 认证的域名
  4. 使用自己的域名代替 api.openai.com

如果具体步骤有问题,可以参考下面的详细版教程。

1f195.png
将域名 NS 转到 Cloudflare

如果域名已经托管在 Cloudflare 的忽略这一步即可。

26a0.png
经评论区指出,Cloudflare Workers 的域名绑定仅支持托管在 Cloudflare 上的域名。由于本人常年是把域名托管在 Cloudflare 的没有注意到这一点,所以得先将域名的 NS 转到 Cloudflare,如果介意将域名转到 Cloudflare 的话,可以考虑使用 nginx 反代、Docker 容器等其他方法1f972.png

没有 Cloudflare 账号的话可以注册一个,具体注册细节就不多说了。注册或登录到 Cloudflare 的管理界面后,点击侧边栏的 “Websites” ,然后点击 “Add a Site” 按钮准备将域名转到 Cloudflare:

222916699-9f076d54-4f5b-4420-9d28-c3575d83c6a0.png

在 “Enter your site (example.com)” 处输入要转入的域名后,点击 “Add Site”:

222916797-637a6fff-8331-423a-bbff-13183dcd041a.png

根据 Cloudflare 的提示,在域名注册商处将 NS 修改到 Cloudflare 指定的地址,等待域名解析成功后,即可进行后续操作。

创建一个 Cloudflare Worker

登录到 Cloudflare 的管理界面后,点击侧边栏的 “Workers” 选项,然后点击 “Create a Service” 创建一个 Worker。

222871270-d973e2bd-74f9-4efa-b080-e665903a7bac.png

然后在创建界面中输入 “Service name” 后点击 “Create Service” 按钮新建 Worker。“Select a starter” 项先不用管。

222871439-4ac253c6-d87f-434e-a8e8-3d05c652217d.png

至此 Cloudflare 的 Worker 便创建好了,下面开始修改 Worker 的代码,使其能代理 OpenAI 的 API。

修改 Cloudflare Worker 的代码

在 Worker 的管理界面,点击右上角的 “Quick Edit” 按钮编辑代码 Worker 的代码。

222871710-c1d4834e-3bb4-49cf-a9dd-b7dcee258112.png

在左侧的代码编辑器中,删除现有的所有代码,然后复制粘贴以下内容到代码编辑器:

// Website you intended to retrieve for users.
const upstream = 'api.openai.com'

// Custom pathname for the upstream website.
const upstream_path = '/'

// Website you intended to retrieve for users using mobile devices.
const upstream_mobile = upstream

// Countries and regions where you wish to suspend your service.
const blocked_region = []

// IP addresses which you wish to block from using your service.
const blocked_ip_address = ['0.0.0.0', '127.0.0.1']

// Whether to use HTTPS protocol for upstream address.
const https = true

// Whether to disable cache.
const disable_cache = false

// Replace texts.
const replace_dict = {
    '$upstream': '$custom_domain',
}

addEventListener('fetch', event => {
    event.respondWith(fetchAndApply(event.request));
})

async function fetchAndApply(request) {
    const region = request.headers.get('cf-ipcountry').toUpperCase();
    const ip_address = request.headers.get('cf-connecting-ip');
    const user_agent = request.headers.get('user-agent');

    let response = null;
    let url = new URL(request.url);
    let url_hostname = url.hostname;

    if (https == true) {
        url.protocol = 'https:';
    } else {
        url.protocol = 'http:';
    }

    if (await device_status(user_agent)) {
        var upstream_domain = upstream;
    } else {
        var upstream_domain = upstream_mobile;
    }

    url.host = upstream_domain;
    if (url.pathname == '/') {
        url.pathname = upstream_path;
    } else {
        url.pathname = upstream_path + url.pathname;
    }

    if (blocked_region.includes(region)) {
        response = new Response('Access denied: WorkersProxy is not available in your region yet.', {
            status: 403
        });
    } else if (blocked_ip_address.includes(ip_address)) {
        response = new Response('Access denied: Your IP address is blocked by WorkersProxy.', {
            status: 403
        });
    } else {
        let method = request.method;
        let request_headers = request.headers;
        let new_request_headers = new Headers(request_headers);

        new_request_headers.set('Host', upstream_domain);
        new_request_headers.set('Referer', url.protocol + '//' + url_hostname);

        let original_response = await fetch(url.href, {
            method: method,
            headers: new_request_headers,
            body: request.body
        })

        connection_upgrade = new_request_headers.get("Upgrade");
        if (connection_upgrade && connection_upgrade.toLowerCase() == "websocket") {
            return original_response;
        }

        let original_response_clone = original_response.clone();
        let original_text = null;
        let response_headers = original_response.headers;
        let new_response_headers = new Headers(response_headers);
        let status = original_response.status;
                
                if (disable_cache) {
                        new_response_headers.set('Cache-Control', 'no-store');
            }

        new_response_headers.set('access-control-allow-origin', '*');
        new_response_headers.set('access-control-allow-credentials', true);
        new_response_headers.delete('content-security-policy');
        new_response_headers.delete('content-security-policy-report-only');
        new_response_headers.delete('clear-site-data');
                
                if (new_response_headers.get("x-pjax-url")) {
            new_response_headers.set("x-pjax-url", response_headers.get("x-pjax-url").replace("//" + upstream_domain, "//" + url_hostname));
        }
                
        const content_type = new_response_headers.get('content-type');
        if (content_type != null && content_type.includes('text/html') && content_type.includes('UTF-8')) {
            original_text = await replace_response_text(original_response_clone, upstream_domain, url_hostname);
        } else {
            original_text = original_response_clone.body
        }
                
        response = new Response(original_text, {
            status,
            headers: new_response_headers
        })
    }
    return response;
}

async function replace_response_text(response, upstream_domain, host_name) {
    let text = await response.text()

    var i, j;
    for (i in replace_dict) {
        j = replace_dict[i]
        if (i == '$upstream') {
            i = upstream_domain
        } else if (i == '$custom_domain') {
            i = host_name
        }

        if (j == '$upstream') {
            j = upstream_domain
        } else if (j == '$custom_domain') {
            j = host_name
        }

        let re = new RegExp(i, 'g')
        text = text.replace(re, j);
    }
    return text;
}


async function device_status(user_agent_info) {
    var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
    var flag = true;
    for (var v = 0; v < agents.length; v++) {
        if (user_agent_info.indexOf(agents[v]) > 0) {
            flag = false;
            break;
        }
    }
    return flag;
}

最后点击编辑器右下角的 “Save and deploy” 按钮部署该代码,在弹出的对话框中继续选择 “Save and deploy” 确认部署。

222872146-bf4c8f30-307a-4511-9be6-8c19db5cab43.png

至此,便可以使用该 worker 的地址来代替 OpenAI 的 API 地址了。比如想要请求 ChatGPT 的 API 时,把官方文档中的 https://api.openai.com/v1/chat/completions 替换成 https://openai.workers.dev 即可(注意这个地址并不存在,是需要换成自己刚刚创建的 Worker 的地址)。

但是你可能会发现,这样做了依然还是没有解决问题,因为 Cloudflare Workers 的 workers.dev 域名也是被 GFW 认证过的1f972.png
。但是好在只是认证了 workers.dev 域名,而 ip 还是幸存的状态,所以我们可以给 Worker 绑定一个自己的域名。

绑定域名

在 Cloudflare Workers 的管理界面中,点击 “Triggers” 选项卡,然后点击 “Custom Domians” 中的 “Add Custom Domain” 按钮以绑定域名。

222872491-026600f5-c04c-49c5-9fdf-4d4abb0b66f7.png

输入域名后点击 “Add Custom Domain”,根据提示修改域名的 DNS 记录。因为我的域名是托管在 Cloudflare 上的,所以无需手动更改 DNS 记录,如果域名没有托管在 Cloudfalre 上,可以根据相关提示自行配置。26a0.png
据评论区提示,目前只支持 NS 托管在 Cloudflare 上的域名,如果不介意,可以点击 Cloudflare 侧边栏的 “Websites”,然后点击 “Add a Site” 按钮,根据提示将域名的 NS 记录指定到 Cloudflare。

222872581-b99c8870-bcc7-4b8d-ba1e-1ad7830ce776.png

至此便大功告成。等待片刻,应该就可以通过你自己的域名来代替 OpenAI 的 API 地址了,比如在本文的例子中,想要请求 ChatGPT 的 API ,即是把官方 API 地址 https://api.openai.com/v1/chat/completions 换为我自己的域名 https://openai.nooc.ink/v1/chat/completions ,其他参数均参照官方示例即可。由于 Cloudflare 有每天免费 10 万次的请求额度,所以轻度使用基本是零成本的。26a0.png
注意请不要使用我这里的 openai.nooc.ink,因为随时可能会被我关闭1f92a.png

222873100-8979dd0e-9572-4d6b-92d6-86d012bdd188.png


https://github.com/noobnooc/noobnooc/discussions/9