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 密钥?
Java 示例代码示例 youtube 数据 api v3 和授权方法作为 api 密钥