Youtube API 密钥

Posted

技术标签:

【中文标题】Youtube API 密钥【英文标题】:Youtube API Key 【发布时间】:2017-01-25 08:50:43 【问题描述】:

当我尝试使用 YouTube API 进行搜索时,我收到此错误:

出现服务错误:403:请求未指定任何 android 包名称或签名证书指纹。请确保 客户端正在发送它们或使用 API 控制台更新您的 关键限制。

在 MainActivity 我有这个代码:

youtube = new YouTube.Builder(new NetHttpTransport(), JSON_FACTORY, new HttpRequestInitializer() 
                    @Override
                    public void initialize(HttpRequest httpRequest) throws IOException 

                    
                ).setYouTubeRequestInitializer(new YouTubeRequestInitializer(apiKey)).setApplicationName("Some Name").build();

在云控制台中,我有一个适用于 Android 的 ApiKey,其中设置了包名称和使用 keytool 命令获得的 SHA-1 编号。

【问题讨论】:

您的问题找到解决方案了吗? 【参考方案1】:

我终于找到了解决这个问题的方法:)

在 Google Developer Console 中创建 API_KEY 并使用“包名称”和“SHA-1 证书指纹”对其进行限制后,您必须在每个 youtube api 请求中提供这些数据。步骤如下:

1- 获取包名:

String packageName = context.getPackageName();

2- 获取 SHA-1:

private String getSHA1(String packageName)
    try 
        Signature[] signatures = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures;
        for (Signature signature: signatures) 
            MessageDigest md;
            md = MessageDigest.getInstance("SHA-1");
            md.update(signature.toByteArray());
            return BaseEncoding.base16().encode(md.digest());
        
     catch (PackageManager.NameNotFoundException e) 
        e.printStackTrace();
     catch (NoSuchAlgorithmException e) 
        e.printStackTrace();
    
    return null;

3- 准备youtube api http header:

youTube = new YouTube.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), new HttpRequestInitializer() 
    @Override
    public void initialize(HttpRequest request) throws IOException 
        String packageName = context.getPackageName();
        String SHA1 = getSHA1(packageName);

        request.getHeaders().set("X-Android-Package", packageName);
        request.getHeaders().set("X-Android-Cert",SHA1);
    
).setApplicationName(appName).build();

4- 随心所欲地构建您的 youtube api 查询: 例如搜索视频:

YouTube.Search.List query;
query = youTube.search().list("id, snippet");
query.setKey(YOUR_API_KEY);
query.setType("video");
query.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url)");
query.setQ(search keywords);
SearchListResponse response = query.execute();
List<SearchResult> results = response.getItems();

然后处理返回的搜索结果。

【讨论】:

您在哪里找到用于放置包和 sha1 指纹的信息? 在为项目创建 Android 客户端密钥时,需要包名和 SHA-1。 你在哪里找到这个关于hot to add package name and SHA1指纹到请求头的文档? @AymanAl-Absi 我尝试了您的上述解决方案。我仍然收到错误消息(“Android 软件包名称和签名证书指纹、com.example.somename 和 ZFzdtB22bpkKGc1kSgi0qxUPSWk=,与您的 API 密钥上配置的应用限制不匹配。”) @Audumbar 尝试以小写十六进制码格式发送 SHA1,例如:(AB:8A:CC:7R....) 作为 (ab8acc7r...)。为我工作。【参考方案2】:

经过大量的反复试验,最终对我有用的事情是将 API 的 API KEY 限制更改为 None 而不是 Android管理器控制台并保存。

完成上述步骤后,我可以使用我的 API KEY 从我的 Android 设备进行搜索 API 调用。

【讨论】:

这是当时唯一对我有用的解决方案。 这可以被视为一种变通方法,它可以工作,但受限密钥的主要问题仍未解决 @Exception 此解决方案不适用于发布版本,仅适用于调试阶段。发布版本如何解决? 此解决方案在发行版中不起作用。还有其他更新吗? @AslamHossin,您是否正确执行了所有步骤,因为对我而言,修复适用于发布版本。【参考方案3】:

尝试仔细检查您在创建 OAuth 凭据时是否正确遵循了设置。并确保在开发者控制台中启用 YouTube 数据 API。

这里是您需要做的steps。

    Package name 字段中,输入您的 Android 应用的 package name

    在终端中,运行 Keytool utility 到 获取数字签名的 .apk 文件公开的 SHA1 指纹 证书。

keytool -exportcert -alias androiddebugkey -keystore path-to-debug-or-production-keystore -list -v

    将 SHA1 指纹粘贴到请求的表单中。

我还在此SO question 中发现一位 Google 员工回答说用户必须通过 OAuth2。因为 Data API v3 不支持服务帐号。

【讨论】:

以上是关于Youtube API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

带有 API v3 的 Youtube 视频标题没有 API 密钥?

缺少有效的 YouTube API 密钥

Java 示例代码示例 youtube 数据 api v3 和授权方法作为 api 密钥

限制为Android时,YouTube API密钥会出现500错误

在客户端应用程序中保护 YouTube v3 API 密钥

用于通过PHP访问Youtube的Google API密钥