Appcelerator Titanium:Facebook 图片上传失败

2024-03-27

我的 Titanium 软件中从 Facebook 上传图像时出现错误,每次我想从我的应用程序上传图像时,我都会收到以下信息:

失败:v2.1 及更高版本已弃用 REST API

但如果我在 KitchenSink 示例应用程序中尝试相同的代码,它会完美运行:

var xhr = Titanium.Network.createHTTPClient({
        onload: function() {
     // first, grab a "handle" to the file where you'll store the downloaded data
            var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,'mygraphic.png');
            f.write(this.responseData); // write to the file
            var blob = f.read();
            var data = {
                caption: 'behold, a flower',
                picture: blob
            };
            facebook.request('photos.upload', data, showRequestResult);
        },
        timeout: 10000
    });
    xhr.open('GET','http://www.pur-milch.de/files/www/motive/pm_motiv_kaese.jpg');
    xhr.send(); 

在我的应用程序中:

function showRequestResult(e) {
    var s = '';
    if (e.success) {
        s = "SUCCESS";
        if (e.result) {
            s += "; " + e.result;
        }
    } else {
        s = "FAIL";
        if (e.error) {
            s += "; " + e.error;
        }
    }
    alert(s);
}
Ti.App.hs_stats.addEventListener('touchend', function(e){
Ti.App.hs_stats.top = 255;
var xhr = Titanium.Network.createHTTPClient({
        onload: function() {
     // first, grab a "handle" to the file where you'll store the downloaded data
            var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,'mygraphic.png');
            f.write(this.responseData); // write to the file
            var blob = f.read();
            var data = {
                caption: 'behold, a flower',
                picture: blob
            };
            Ti.App.fb.request('photos.upload', data, showRequestResult);
        },
        timeout: 10000
    });
    xhr.open('GET','http://www.pur-milch.de/files/www/motive/pm_motiv_kaese.jpg');
    xhr.send();     
});

看起来您正在为 Appcelerator 使用“旧”Facebook 模块?我有适用于个人资料和页面的图像上传(尽管页面有点不同,我稍后会解释)。这是一些快速代码(我假设您已经通过 Facebook 进行了身份验证):

 var fb = require('facebook');
 fb.appid = "xxxxxxxxxxxxxxxxx";
 var acc = fb.getAccessToken();

 fb.requestWithGraphPath('me/photos?access_token='+ acc, {picture:image, message: data}, "POST", showRequestResult);

image 变量只是一个 blob - 它直接来自来自画廊选择或相机意图的 event.media。 data 是您的状态更新的文本。

在 tiapp.xml 中添加以下行:

 <property name="ti.facebook.appid">xxxxxxxxxxxxxxxxx</property>

以及(如果您使用的是 Android 和 iOS - 添加两者或仅添加您正在使用的平台)

 <modules>
    <module platform="android">facebook</module>
    <module platform="iphone">facebook</module>
</modules>

现在 Pages 有点奇怪:

var endPoint = 'https://graph.facebook.com/v2.1/' + pid + '/photos?access_token='+ acc;
                                            xhr.open('POST',endPoint);
                                            xhr.send({
                                                message: data,
                                                picture: image
                                            });

您必须使用 HTTP 请求,因为无论我尝试什么,我都无法使用 requestWithGraphPath() 来处理页面。

pid 是您的页面 ID,您可以获取它,或者是您作为管理员的页面列表,如下所示(同样,创建一个新的 HTTP 请求 (xhr) 并使用它):

xhr.open("GET","https://graph.facebook.com/v2.1/me?fields=accounts{access_token,global_brand_page_name,id,picture}&access_token=" +fb.getAccessToken());

这将返回每个页面的访问令牌、全局品牌名称(基本上是页面名称的干净版本)、它的 ID 和个人资料图片。此 URL 中的访问令牌是您的个人访问令牌(&access_token= 部分)。

据我所知,这些访问令牌不会在页面上过期,因此您可以将其保存在应用程序中的某个位置,或者如果您真的想要安全,您可以在每次发布之前获取一个令牌,但这有点多了。

BONUS:

如果您想在页面上发布视频:

var xhr = Titanium.Network.createHTTPClient();
    var endPoint = 'https://graph-video.facebook.com/'+ pid +'/videos?access_token='+ acc;
xhr.open('POST',endPoint);

xhr.setRequestHeader("enctype", "multipart/form-data");

xhr.send({source:video, description:data});

对于配置文件:

         var acc = fb.getAccessToken();
    var xhr = Titanium.Network.createHTTPClient();
    var endPoint = 'https://graph-video.facebook.com/me/videos?access_token='+ acc;
xhr.open('POST',endPoint);

xhr.setRequestHeader("enctype", "multipart/form-data");

xhr.send({source:video, description:data});

视频是来自相机或图库事件的另一个 blob。媒体意图和数据是您要用于状态更新的文本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Appcelerator Titanium:Facebook 图片上传失败 的相关文章

随机推荐

  • 嵌入到java中的网络浏览器[重复]

    这个问题在这里已经有答案了 可能的重复 有没有办法在Java中嵌入浏览器 https stackoverflow com questions 48249 is there a way to embed a browser in java 我
  • 如何在 For Each...Next 循环中获取对象的索引?

    我使用以下语法来循环列表集合 For Each PropertyActor As JCPropertyActor In MyProperty PropertyActors i IndexOf PropertyActor Next 如何获取循
  • Selenium 下载完整的 html 页面

    我正在学习使用 Python Selenium 和 BeautifulSoup 进行网页抓取 目前 我正在尝试抓取Google搜索趋势上的热门搜索http www google com trends hottrends pn p5 http
  • 按索引动态添加项目到 List 而不使用 .Add()

    我试图将项目添加到列表中without动态使用 Add 请注意 由于我的项目的性质 我无法使用字典或简单数组甚至 HashSet 等替代数据结构 我需要一个锻炼解决方案来解决以下问题 List
  • ipython笔记本:如何并行化外部脚本

    我正在尝试使用 ipython 并行库中的并行计算 但我对此知之甚少 并且我发现对于对并行计算一无所知的人来说很难阅读该文档 有趣的是 我发现的所有教程都只是重复使用文档中的示例 并具有相同的解释 在我看来 这是毫无用处的 基本上我想做的是
  • 获取地点的纬度和经度 dbpedia

    我想获取一个我已经知道其名称的地点的纬度和经度 PREFIX geo
  • 有没有办法从 Ruby 中的实例调用私有类方法?

    以外self class send method args 当然 我想在类和实例级别提供一个相当复杂的方法 而不需要重复代码 UPDATE Jonathan Branam 这是我的假设 但我想确保没有其他人找到解决方法 Ruby 中的可见性
  • Objective-C:检查是否使用枚举选项

    我有一个使用 typedef 枚举的自定义对象 如果我为对象设置了一些枚举选项 如何检查这些选项是否正在使用 typedef enum Option1 Option2 Option3 Options 创建对象时我可能会使用 myobject
  • 异步 ASP.NET Web API 中的 ThreadStatic

    是否有可能在单个请求中使用线程静态变量 当前代码使用线程静态变量进行日志记录 现在我们想要使用异步控制器方法 具有异步和等待模式 这会导致问题 因为打开新线程时该变量为空 await会导致线程跳转 所以线程静态变量自然会出现问题 要解决此问
  • 实现 MutationObserver 代替 DOMSubtreeModified

    我有一个select multiple 我已经上过课custom multiselect在我正在捕捉的页面上DOMSubtreeModified事件如下 HTML
  • 使用Python直接向USB发送信号

    如何使用 Python 将 USB 端口连接设置为高或低 这可用于定制 USB 设备 例如 假设我有一个 LED 连接到 USB 端口 数据线 现在通过代码我想闪烁它或控制它 现在 这可以通过使用任何微控制器 Arduino Raspber
  • Android studio 的aspectj - AJDT 插件在哪里

    如何为 android studio 安装 AJDT 我知道 Eclipse 有一个 但我在 android studio 中找不到任何东西 我想做的是在启动之前对我的每个方法调用进行安全检查 我已经从这个网站尝试过AJDT http ec
  • 如何使用 ant build.xml 导入现有的 java web 项目

    我正在尝试使用导入功能将现有的 java web 项目 使用 ant build xml 构建 导入到 Eclipse 中 但 Eclipse 无法将其识别为项目 如何将项目导入到eclipse中 编辑 我所做的是将项目导入为 Java 项
  • 从 GitHub 上已删除的分支恢复作为拉取请求发送的提交

    我做了一件蠢事 I fork在 GitHub 上发布了一个存储库 我做了一些改变 commit把它们放在我的叉子上 我将此提交作为拉取请求回到原来的仓库 愚蠢的部分来了 我deleted 我的叉子 原始存储库的所有者要求在接受拉取请求之前对
  • 图例显示带有 geom_vline 的意外黑线

    在查看了 StackOverflow 上提供的一些答案后 我一直试图添加一个额外的图例 但不知何故我无法完成这项工作 我正在使用以下代码 x breaks lt seq as Date 2010 1 1 as Date 2015 4 1 m
  • 函数隐私和单元测试 Haskell

    你如何处理 Haskell 中的函数可见性和单元测试 如果导出模块中的每个函数以便单元测试可以访问它们 则可能会导致其他人调用不应出现在公共 API 中的函数 我想用 LANGUAGE CPP 然后围绕出口 ifdef LANGUAGE C
  • git svn:svn 的密码未存储

    我正在使用 git svn 对中央远程 svn 存储库使用 git SVN 存储库使用带有自签名证书的 https 一切正常 只有一个令人讨厌的例外 只要我直接使用 svn 密码就会被记住 所以只能在第一个命令中输入密码 当使用git sv
  • window.onload 与

    两者到底有什么区别window onload事件和onload事件的body标签 我什么时候使用哪个以及如何正确完成 window onload myOnloadFunc and 是不同的使用方式同一个事件 Using window onl
  • 如何使用 ScriptTags 为 shopify 开发 Rails 应用程序

    我在 Heroku 中部署了一个 Shopify 应用程序 并使用 Rails 开发 我需要从任何 Shopify 商店的前端调用 JavaScript 函数 我读过这篇文章 http www shopify com technology
  • Appcelerator Titanium:Facebook 图片上传失败

    我的 Titanium 软件中从 Facebook 上传图像时出现错误 每次我想从我的应用程序上传图像时 我都会收到以下信息 失败 v2 1 及更高版本已弃用 REST API 但如果我在 KitchenSink 示例应用程序中尝试相同的代