尝试将 Object-C 转换为 Applescriptobjc 以用于 instagram post finder

Trying to translate Object-C into Applescriptobjc for instagram post finder

所以我有这个 Objective-C 代码,它做了一些我一直试图用普通的 Applescript 绕过我的头脑的事情,也尝试过但失败了 python 我试过(但失败了)在)。我会 post 我已经尝试过的 Applescript,但它基本上毫无价值。所以我求助于 AppleScript/ASOBJC 专家来帮助解决问题。该代码用于将 instagram 媒体 ID 逆向工程为 post ID(因此,如果您有一张您知道来自 IG 的照片,您可以找到该照片的 post ID)。

-(NSString *) getInstagramPostId:(NSString *)mediaId {
NSString *postId = @"";
@try {
    NSArray *myArray = [mediaId componentsSeparatedByString:@"_"];
    NSString *longValue = [NSString stringWithFormat:@"%@",myArray[0]];
    long itemId = [longValue longLongValue];
    NSString *alphabet = @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
    while (itemId > 0) {
        long remainder = (itemId % 64);
        itemId = (itemId - remainder) / 64;
        unsigned char charToUse = [alphabet characterAtIndex:(int)remainder];
        postId = [NSString stringWithFormat:@"%c%@",charToUse , postId];
    }
} @catch(NSException *exception) {
    NSLog(@"%@",exception);
}
return postId;}

上面的代码来自另一个 SO 问题的答案,可以在这里找到: Link

我知道它可能问了很多,但我的数学很烂,所以我不太会 "get" 这段代码,这可能就是我自己无法将它翻译成某种形式的 Applescript 的原因!希望我能在这个过程中有所收获。

下面是代码正在查找的媒体 ID 示例: 45381714_262040461144618_1442077673155810739_n.jpg 这是上面的代码应该转换成的 post ID BqvS62JHYH3

很多关于这些 "calculators" 的研究都来自这个 post from 5 years ago。看起来他们在 post 中指出的 18 位数字与 10 位数字的比例现在是 11 比 19 的比例。我试图测试 Xcode 中的代码,但当我尝试 运行 时出现构建错误。鉴于我是 Xcode n00b 这并不奇怪。

感谢您对此的帮助!

这是将您的 Objective-C 代码(几乎)"word-for-word" 翻译成 ASObjC:

use framework "Foundation"
use scripting additions

on InstagramPostIdFromMediaId:mediaId
    local mediaId

    set postId to ""
    set mediaId to my (NSString's stringWithString:mediaId)
    set myArray to mediaId's componentsSeparatedByString:"_"
    set longValue to my NSString's stringWithFormat_("%@", myArray's firstObject())
    set itemId to longValue's longLongValue()
    set alphabet to my (NSString's stringWithString:(("ABCDEFGHIJKLMNOPQRSTUVWXYZ" & ¬
        "abcdefghijklmnopqrstuvwxyz0123456789-_")))

    repeat while (itemId > 0)
        set remainder to itemId mod 64
        set itemId to itemId div 64
        set unichar to (alphabet's characterAtIndex:remainder) as small integer
        set postId to character id unichar & postId
    end repeat

    return postId
end InstagramPostIdFromMediaId:

"almost",我的意思是原始脚本中使用的每个 Objective-C 方法都已通过对相同 Objective-C 方法通过 ASObjC 桥,有两个例外。我还对其中一行进行了数学性质的简单编辑。因此,我总共进行了 三个 操作更改,其中两个在技术上是功能更改,但最终产生相同的结果:

  1. itemId div 64

    替换(itemId - remainder) / 64
    • AppleScript div 命令执行 整数除法 ,这是由正则表达式给出的数字除法被截断以删除小数点后的所有内容。这在数学上与在执行常规除法之前从 itemId 中减去 remainder 时所做的相同。
  2. 避免 stringWithFormat: 用于将 unicode 字符索引转换为字符串表示的实例

    • NSString 对象将字符串存储为一系列 UTF-16 代码点,而 characterAtIndex: 将从字符串中检索特定代码点,例如0x0041,指的是字符"A"stringWithFormat: 使用 %c 格式说明符将 8 位无符号整数(即 0x00000x00FF 范围内的整数)转换为其字符值。 AppleScript 把它搞砸了,尽管我不确定这如何或为什么会出现问题。解包 charactertAtIndex: 返回的值会产生一个不透明的原始 AppleScript data 对象,例如,看起来像 «data ushr4100»。这可以愉快地被强制转换为 small integer 类型,正确地返回 denary 中的数字 65。因此,无论出现什么问题,都可能是 stringWithFormat: 正在做的事情,所以我使用 AppleScript 的 character id ... 函数来执行与 stringWithFormat: 打算做的相同的操作。
  3. myArray[0] 替换为 myArray's firstObject()

    • 这两个都在 Objective-C 中用于检索数组中的第一个元素。 myArray[0] 是非常熟悉的 C 语法,可以愉快地用于本机 Objective-C 编程,但不适用于 AppleScript。 firstObject 是一种 Objective-C 方法,它包装了底层函数并使其可以在任何 Objective-C 上下文中使用,但也可能会执行一些额外的检查以使其适当安全地使用而无需过多考虑.就我们在​​ AppleScript 上下文中所关注的而言,结果是相同的。

综上所述,向我们的新 ASObjC 处理程序提供 mediaId"45381714_262040461144618_1442077673155810739_n.jpg" 会得到以下结果:

"CtHhS"

而不是您所说的预期结果,即 "BqvS62JHYH3"。但是,很容易看出原因。在每次出现下划线时,这两个脚本都会将 mediaId 拆分为组件 ("text items")。然后只有其中的第一个继续被任一脚本用来确定 postId。对于上面给定的 mediaId,第一个文本项是 "45381714",它太短而不能满足我们的需要,因此上面的错误结果的长度很短。第二个文本项只有 15 位数字(字符)长,因此也不可行。第三个文本项的长度为 19 个字符,长度正确。

因此,我将脚本中的firstObject()替换为item 3。您可以猜到,它不是从存储在 myArray 中的文本项(组件)数组中检索第一项,而是检索第三项,即 "1442077673155810739"。这会产生以下结果:

"BQDSgDW-VYA"

与您预期的相似,但不完全相同。


现在,我会把这个留给你。在这一点上,我通常会将此与您之前的尝试进行比较,但您说它们是 "worthless" 所以我假设这至少为您提供了一段翻译后的代码,就目前而言执行与其对应的 Objective-C 相同的操作。如果您告诉我们您面临的实际障碍的性质是什么,这可能会让我或其他人提供进一步的帮助。

但是因为我可以自信地说这两个脚本在做同样的事情,那么如果原始脚本使用相同的输入产生不同的输出,那么这就告诉我们数据必须在其运行过程中的某个时刻发生变化加工。鉴于我们正在处理一个数量级为 10¹⁹ 的数字,我认为错误很可能是浮点精度的结果。 AppleScript 将绝对值不超过 536870911 的任何整数存储为 class integer 类型,将超过此值的任何整数存储为 class real 类型(浮点数),所以会出现浮点错误。