首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在PHP中使用Curl

在PHP中使用Curl
EN

Stack Overflow用户
提问于 2015-08-08 05:55:34
回答 1查看 2.7K关注 0票数 3

我正在做一个项目,以帮助我学习如何通过PHP使用PHP。我正在尝试使用我自己的帐户从Twitch-API获取数据进行测试。

我已经成功地使用我的域验证了我的帐户,方法是:

代码语言:javascript
运行
AI代码解释
复制
https://api.twitch.tv/kraken/oauth2/authorize?response_type=code&client_id=...&redirect_uri=...&scope=user_read+channel_read+channel_subscriptions+user_subscriptions+channel_check_subscription&state=...

我删除了client_idredirect_uristate,以显示我使用的链接。

成功通过身份验证后,它返回到我指定的域(redirect_uri),一旦它返回到该域,网站只知道用户接受后从抽搐中生成的身份验证密钥。

示例auth:3ofbaoidzkym72ntjua1gmrr66o0nd

现在我希望能够获得用户的用户名,上面有文件

代码语言:javascript
运行
AI代码解释
复制
curl -H 'Accept: application/vnd.twitchtv.v3+json' -H 'Authorization: OAuth <access_token>' \
-X GET https://api.twitch.tv/kraken/user

我试图用PHP来做这件事,但我不明白卷曲函数.到目前为止,我得到的是:

代码语言:javascript
运行
AI代码解释
复制
<?php if(isset($_GET['code']) && isset($_GET['scope'])) { ?>

<pre>
<?php
    $auth = $_GET['code'];
    $twitch = curl_init();

    $headers = array();
    $headers[] = 'Accept: application/vnd.twitchtv.v3+json';
    $headers[] = 'Authorization: OAuth ' .$auth;
    curl_setopt($twitch, CURLOPT_HEADER, $headers);
    curl_setopt($twitch, CURLOPT_URL, "https://api.twitch.tv/kraken/user");

    curl_exec($twitch);
?>
</pre>

<?php }; ?>

当我试图运行这部分代码时,会发现一些错误:

代码语言:javascript
运行
AI代码解释
复制
HTTP/1.1 401 Unauthorized
Server: nginx
Date: Sat, 08 Aug 2015 13:43:51 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 89
Connection: keep-alive
Status: 401 Unauthorized
X-API-Version: 3
WWW-Authenticate: OAuth realm='TwitchTV'
Cache-Control: max-age=0, private, must-revalidate
Vary: Accept-Encoding
X-UA-Compatible: IE=Edge,chrome=1
X-Request-Id: 4bc2e0bfadf6817366b4eb19ab5751bf
X-Runtime: 0.007862
Accept-Ranges: bytes
X-Varnish: 1641121794
Age: 0
Via: 1.1 varnish
X-MH-Cache: rails-varnish-5cb970; M

{"error":"Unauthorized","status":401,"message":"Token invalid or missing required scope"}

但是我不确定如何解决这个问题,因为,在我看来,我已经做了所有文件上说要做的事情.

我该如何解决这个问题呢?

编辑:

如果我请求使用我的抽动用户名,这似乎是可行的。

代码语言:javascript
运行
AI代码解释
复制
curl -H 'Accept: application/vnd.twitchtv.v3+json' \
-X GET https://api.twitch.tv/kraken/users/test_user1

我使用用户名的代码:

代码语言:javascript
运行
AI代码解释
复制
<?php
$auth = urlencode($_GET['code']);
$twitch = curl_init();

$headers = array();
$headers[] = 'Accept: application/vnd.twitchtv.v3+json';
#$headers[] = 'Authorization: OAuth ' .$auth;
curl_setopt($twitch, CURLOPT_HTTPHEADER , $headers);
curl_setopt($twitch, CURLOPT_URL, "https://api.twitch.tv/kraken/users/...");

curl_exec($twitch);
?>

但是,我不会知道用户的用户名,除非我从产生错误的语句中获得用户名,并将其存储在数据库中。

编辑:

更多地阅读文档,它需要范围和访问令牌。我得到了这个:

示例:

代码语言:javascript
运行
AI代码解释
复制
Array
(
    [0] => Accept: application/vnd.twitchtv.v3+json
    [1] => Authorization: OAuth code=scn89zerug002sr6r95z9ngbxmd0d2&scope=user_read+channel_read+channel_subscriptions+user_subscriptions+channel_check_subscription
)

但我还是明白错误..。

编辑:

因此,我阅读了文档甚至更多的,现在我已经读到了以下内容:

代码语言:javascript
运行
AI代码解释
复制
class twitch {
    var $base_url = "https://api.twitch.tv/kraken/";
    var $client_id = "...";
    var $client_secret = "...";
    var $return_url = "...";
    var $scope_array = array('user_read','channel_read','channel_subscriptions','user_subscriptions','channel_check_subscription');

    public function get_access_token($code,$state) {
        $ch = curl_init($this->base_url . "oauth2/token");
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        $fields = array(
             'client_id' => $this->client_id,
             'client_secret' => $this->client_secret,
             'grant_type' => 'authorization_code',
             'redirect_uri' => $this->redirect_url,
             'code' => $code
        );
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        $data = curl_exec($ch);
        $response = json_decode($data, true);
        curl_close($ch);

        echo "<pre>".print_r($this->redirect_url,true)."</pre>";
        echo "<pre>".print_r($response,true)."</pre>";

        return $response["access_token"];
    }
};

$auth = new twitch();
print_r($auth->get_access_token($_GET['code'],$_GET['state']));

但这一次出现了的另一个错误,它说我的'redirect_uri' => $this->redirect_url与通过抽搐持有的'redirect_uri' => $this->redirect_url不同。

代码语言:javascript
运行
AI代码解释
复制
Array
(
    [error] => Bad Request
    [status] => 400
    [message] => Parameter redirect_uri does not match registered URI
)

我甚至复制和粘贴从抽搐网站到我的变量和反过来,我仍然得到同样的错误.现在我被困得更深了,但至少更近了一步。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-08 07:53:28

是的,我要和你一起做这个,就像我做的那样:d到目前为止,我已经有了一个用户,你得到错误的原因是你没有设置任何卷曲选项。我是用这个calls.php自学的,在学习卷发的时候我发现这是非常有帮助的。代码本身是基本的,但它很容易阅读。我设法理解了它,使它更加复杂:D

首先,我将向您展示如何获得测试用户。您要做的是设置选项,我将首先使用简单的方法。

这两种方法分别是CURLOPT_HEADERCURL_RETURNTRANSFER。您的url可以用init函数设置。

代码语言:javascript
运行
AI代码解释
复制
$twitch=curl_init('https://api.twitch.tv/kraken/users/test_user1');
curl_setopt($twitch,CURLOPT_HTTPHEADER,array('Accept: application/vnd.twitchtv.v3+json'));//must be an array.
curl_setopt($twitch,CURLOPT_RETURNTRANSFER,true);
$result=curl_exec($twitch);
$info=curl_getinfo($twitch);
print_r($result);

这将使您获得您的测试用户,并希望向您展示一下您做错了什么。如果您想使用数组方法,那么您必须使用curl选项作为数组键,以便set函数知道设置什么为。(不要问我这一切在技术上是如何运作的:S)

我将更新,以向您展示如何获得授权和数据,一旦我已经解决了。但是,基本原则是您需要发送post数据并将CURLOPT_POST设置为true,并包含postdata CURLOPT_POSTFIELDS,这必须是一个json数组,因为您的应用程序需要json。

无论如何,数组:

代码语言:javascript
运行
AI代码解释
复制
curl_set_opts($twitch,array(CURLOPT_HEADER=>array('Accept: application/vnd.twitchtv.v3+json',CURLOPT_RETURNTRANSFER=true));

既然您已经知道如何授权用户,我将跳过这一点,尽管我建议使用比$_GET更安全的东西。也许会话变量会更好一些。

使用返回的Auth获取特定用户。你想做这样的事情:(对不起,我不能亲自测试,我没有twitch帐户)

代码语言:javascript
运行
AI代码解释
复制
$twitch=curl_init('https://api.twitch.tv/kraken/user');
curl_setopt($twitch,CURLOPT_HEADER,array('Accept: application/cvd.twitchtv.v3+json','Authorization: OAuth '.$_SESSION['token']));
curl_setopt($twitch,CURLOPT_RETURNTRANSFER,true);
$result=curl_exec($twitch);
print_r($result);
//don't forget to close! 
curl_close($twitch);
$user=json_decode($result);

echo$user->display_name;

虽然我不知道您是如何获得oAuth令牌lol的,但这应该是可行的

如果你想成为一个真正酷酷的程序员8,我建议你为此做一些课程。像这样

代码语言:javascript
运行
AI代码解释
复制
class twitch{
    private$token,$twitch,$url="http://api.twitch.tv/kraken/";
    protected$code,$state,$report;
    private static$details;
    public function __construct($code,$state){
        $this->code=$code;
        $this->state=$state;
        self::$details=(object)array('client_id'=>'id','client_secret'=>'secret','return_url'=>'redirect');
        $result=$this->makeCall('oauth2/token',true);
        print_r($result);
    }
    protected function makeCall($extention,$auth=false,$object=true){
        $this->twitch=curl_init($this->url.$extention);
        //$opts=array(CURLOPT_)
        if($auth!==false){
            $opts=array(CURLOPT_FOLLOWLOCATION=>true,CURLOPT_RETURNTRANSFER=>true,CURLOPT_POST=>true,CURLOPT_POSTFIELDS=>json_encode(array('client_id'=>self::$details->client_id,'client_secret'=>self::$details->client_secret,'grant_type'=>'authorization_code','code'=>$this->code,'redirect_uri'=>self::$details->return_url)));
        }else{
            $opts=array(CURLOPT_HEADER=>array('Accept: application/cvd.twitchtv.v3+json','Authorization: OAuth '.$this->token),CURLOPT_RETURNTRANSFER=>true);
        }
        curl_setopt_array($this->twitch,$opts);
        $result=curl_exec($this->twitch);
        $this->report=array('info'=>curl_getinfo($this->twitch),'error'=>curl_error($this->twitch));
        curl_close($this->twitch);
        return($object===true)?json_decode($result):$result;
    }
    protected function userDetails(){
        return$this->makeCall('user');
    }
    public function user(){
        return$this->userDetails();
    }
}       
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31893829

复制
相关文章
angular4实战(4)ngrx
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/78161765
j_bleach
2019/07/02
1.2K0
angular4实战(4)ngrx
Angular 4 组件通信
最近在项目上,组件跟组件之间可能是父子关系,兄弟关系,爷孙关系都有。。。。。我也找找了很多关于组件之间通讯的方法,不同的方法应用在不同的场景,根据功能需求选择组件之间最适合的通讯方式。下面我就总结一下关于组件通讯的N多种方法。
半指温柔乐
2020/06/10
9300
忘记 Angular 3:Google 将发布 Angular 4
2016年11月,当Google详细说明将在Angular 2到来的短短6个月后发布Angular 3的计划时,每个人都大吃一惊。现在,事实证明终究“No Angular 3”发布。相反,Google将于2017年3月正式推出其流行的JavaScript框架的第4版。
疯狂的技术宅
2019/03/28
1K0
忘记 Angular 3:Google 将发布 Angular 4
angular4实战(1) angular-cli
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/78077403
j_bleach
2019/07/02
6920
angular4实战(1) angular-cli
(4)Angular的开发
angular框架,库,是一款非常优秀的前端高级JS框架,有了这个框架就可以轻松构建SPA应用程序,通过指令宽展了HTML,通过表达式绑定数据到HTML。
达达前端
2019/07/22
3.1K0
Angular4 实战开发
本文介绍了Angular4实战开发系列文章,该系列文章以用为主,结合通俗易懂的实例来让大家理解常用的知识点。主要内容包括:Angular CLI、创建组件、使用CSS美化组件、属性和事件绑定、组件通讯、创建指令、创建服务、创建管道、创建表单和路由导航、动画。通过本系列文章,用户可以快速掌握Angular4的实战开发技能。
IMWeb前端团队
2018/01/08
7270
Angular企业级开发(4)-ngResource和REST介绍
一、RESTful介绍 RESTful维基百科 REST(表征性状态传输,Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出
八哥
2018/01/18
8560
Angular企业级开发(4)-ngResource和REST介绍
高级 Angular 组件模式 (4)
命名冲突不仅存在于指令的选择器之间,同时也会存在于指令的Inputs和Outputs属性,当这些属性名一样时,Angular并不会进行提示,它会按原本的逻辑正常工作。这种情况有时候是我们希望看到的,有些时候却不是。
littlelyon
2018/10/19
7890
Angular4 实战开发
《Angular 实战系列》目前处于章节不定,内容不定阶段,这一系列文章不会长篇大论的讲解概念,而是以用为主,结合通俗易懂的实例来让大家理解常用的知识点。
IMWeb前端团队
2019/12/06
5580
Angular4记账webApp练手项目之一(利用angular-cli构建Angular4.X项目)
官方文档 :https://github.com/angular/angular-cli
易兒善
2018/08/21
1.1K0
Angular4记账webApp练手项目之一(利用angular-cli构建Angular4.X项目)
SPA网站SEO优化PhantomJs
随着web2.0的兴起,ajax的时代已经成为了事实,更如今Knockout,backbone, angular,ember前端MDV(model driver view)框架强势而来,Single Page Application已经为大家所熟悉了。如今常见的SPA程序,restfull和前端MDV之类的框架能够实实在在的减少我们的代码开发量,让我更多的注意力关注在真正的业务逻辑上。在众多前端MDV框架从博客中可以看出来笔者还是钟爱于angular,然而服务端平台的选择的话:在.net平台笔者会首选webapi+oData,jvm平台spring restfull。
javascript.shop
2019/09/04
2K0
SPA网站SEO优化PhantomJs
Angular4记账webApp练手项目之二(在angular4项目中使用Angular WeUI)
安装后还需要引用weui 样式以及我们的font-awesome图标苦,在我们项目index.html中引用
易兒善
2018/08/21
2.2K0
Angular4记账webApp练手项目之二(在angular4项目中使用Angular WeUI)
4、Angular JS 学习笔记 – 模块 [翻译中]
你可以认为一个模块就是一个app的不同部分,controllers,services,filters,directives,等。
前Thoughtworks-杨焱
2021/12/08
9660
angular4实战(2) router
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/78077844
j_bleach
2019/07/02
5750
angular4实战(2) router
ionic4 -- angular 跳转页面
ionic4 与前辈们最大的不同就是通过angular引入了route,这样每次跳转的时候只需要直接跳转对应的路由地址就可以了,给了路由器上的解耦,也解决了原来的RXjs与Events的子页面反复跳转重复添加监听问题【挖坑,具体操作等后面进一步深入研究】。通过翻阅源码,我们看到:
stormKid
2018/09/12
2.9K0
ionic4 -- angular 跳转页面
Angular4记账webApp练手项目之五(Angular4项目中创建service(服务)和使用http模块)
ng给我们创建的模块account.service.ts,内容如下。 有关@Injectable和@Component,都是angular中的关键字或者关键注解。通过注解来表明js文件的类型,以方便angular框架进行调用。 @Component表示该js文件所导出的类是组件。 @Injectable表示该js文件所导出的文件是服务,而服务是可以通过注入来创建的。 服务的注入,是angular中用来剥离controller和业务逻辑的方式。
易兒善
2018/08/21
1.3K0
Angular4记账webApp练手项目之五(Angular4项目中创建service(服务)和使用http模块)
Angular2 VS Angular4 深度对比:特性、性能
在Web应用开发领域,Angular被认为是最好的开源JavaScript框架之一。
葡萄城控件
2022/05/09
8.8K0
Angular2 VS Angular4 深度对比:特性、性能
angular4 Flex Layout开发实践
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/77513213
j_bleach
2019/07/02
1.1K0
angular4 Flex Layout开发实践
Angular Input和Output
Input 是属性装饰器,用来定义组件内的输入属性。在实际应用场合,我们主要用来实现父组件向子组件传递数据。Angular 应用是由各式各样的组件组成,当应用启动时,Angular 会从根组件开始启动,并解析整棵组件树,数据由上而下流下下一级子组件。
阿宝哥
2019/11/06
2.4K0
点击加载更多

相似问题

在hashbang之前使用nginx、angular.js和prerender.io

20

将Angular .htaccess与Prerender.io .htaccess合并

123

Angular4,材料和Angular4

23

基于HTML Unit和prerender.io的Angular搜索引擎优化

11

Beego和Angular 4

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档