1

我试图弄清楚如何允许在状态/更新期间发布特殊命令。API文档统计,如果发布带有“D”,“M”的推文,它将在命令后向用户发送直接消息。

我尝试用“不间断空格”(%A0)替换第一个字符。然而 twitter 将这些字符翻译成�。

我能想到的唯一其他选择是创建一个正则表达式,它可以去除所有潜在危险的 SMS 代码。这并不理想,因为我更愿意保留原始推文。比如发推文:“D Day 是一部不错的电影。” 将导致“白天是一部不错的电影”。

我还尝试在帖子之前输入一个空格,但它被忽略了,仍然发送了直接消息。是否有某种转义字符或作弊使 twitter 忽略这些命令?

4

1 回答 1

1

看起来我找到了解决方案。有几个问题。第一个是我的百分比编码函数不接受 unicode 字符,所以 twitter 用 � 响应。为了解决这个问题,我在 VB.Net 中使用了以下代码:

Regex.Replace(Uri.EscapeDataString(s), "[\!\*\'\(\)]", Function(m) Uri.HexEscape(Convert.ToChar(m.Value(0).ToString())))

第二个问题是 twitter 对所有空白字符都一视同仁。因此,您不能作弊并使用诸如 u+00A0(不间断空格)之类的字符或以下所列的任何其他字符:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf (6.4) http://en.wikipedia.org/wiki/Whitespace_character

幸运的是,twitter 不包含零宽度空格作为空白字符。如果使用零宽度空间,twitter 实际上还允许通过 API 发布 141 个字符。这意味着您可以在 SMS 命令之后和空格之前添加 U+200B 以防止 SMS 命令运行。如:

Dim s as String = "M" & ChrW(8203) & " Username 140 character tweet posted here as a test. This is actually 141 characters because of the zero-width space. But accepted anyway."

希望这可以帮助!

更新:

对于那些正在寻找正则表达式代码的人来说,这是一个 1 班轮:

Regex.Replace(s, "^(ON|OFF|FOLLOW|F|UNFOLLOW|LEAVE|L|STOP|QUIT|END|CANCEL|UNSBSCRIBE|ARRET|D|M|RETWEET|RT|SET|WHOIS|W|GET|G|FAV|FAVE|FAVORITE|FAVORITE|\*|STATS|SUGGEST|SUG|S|WTF|HELP|INFO|AIDE|BLOCK|BLK|REPORT|REP)( )", Function(m) m.ToString.Replace(" ", ChrW(8203) & " "))
于 2013-11-14T06:26:17.693 回答