【问题标题】:I have been asked to get the resources from a web page using google chrome in Android我被要求在 Android 中使用 google chrome 从网页获取资源
【发布时间】:2021-08-09 11:54:43
【问题描述】:

您必须从网站服务获取“candidates/2021_05/mohamed_nagy_b3b03cbe”资源: https://hire.verkata.com/askme/ 使用运行在 Android 手机上的 Chrome 浏览器,通过从http://google.com/candidates/mohamed_nagy 指向资源的链接,使上面的 GET 请求看起来好像是在发送它。否则,Web 服务会给您一个拒绝访问错误。 谁能给我一些关于我们如何在android中完成类似任务的指导,而我以前没有这样做过,好吗? 注意:我正在使用纯 JavaSacript fetch API 但无法解决难题,很遗憾。

客户端 index.js

let button = document.getElementById('generate');
let Info = document.querySelector('Info');
const key = 'candidates/2021_05/mohamed_nagy_b3b03cbe';
const url = 'https://hire.verkata.com/askme/';
button.addEventListener('click', () => {
    fetchWeather(url, key)
        .then((data) => {
            postData('/', {
                Information: data.content(),
            })
        }).then(() => {
            updateUI();
        })
});
const fetchWeather = async (url, key) => {
    const res = await fetch(url + key)
    try {
        const data = await res.json();
        console.log(data);
        return data;
    } catch (error) {
        console.log("Error:", error) // appropriately handle the error
    }
};
const postData = async (url = '', data = {}) => {
    console.log(data)
    const response = await fetch(url, {
        method: 'POST',
        credentials: 'same-origin',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(data), // body data type must match "Content-Type" header
    });
    try {
        const newData = await response.json();
        console.log(newData);
        return newData
    } catch (error) {
        console.log('Error', error);
    }
};
const updateUI = async () => {
    const request = await fetch('/all');
    try {
        const allData = await request.json();
        console.log(allData);
        document.getElementById('info').innerHTML = allData.Info;
    } catch (error) {
        console.log('error', error);
    }
};

server.js

let projectData = {};
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());
const cors = require('cors');
app.use(cors());
const fetch = require('node-fetch');
app.use(express.static('website'));
const port = 8888;
app.listen(port, () => { 
    console.log(`server is running on localhost port number: ${port}`)
});
app.post('/', (req, res) => {
    console.log(req.body)
    const newEntry = {
        Info: req.body.Information,
    }
    projectData = newEntry // projectData.push(newEntry)
    res.send(projectData)
});
app.get('/all', (req, res) => {
    console.log(projectData);
    res.send(projectData);
});

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fetch API</title>
<link href="https://fonts.googleapis.com/css?family=Oswald:400,600,700|Ranga:400,700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css">
<!--[if lt IE 9]>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.js"></script>
<![endif]-->
</head>
 <body>
<div id = "app">
  <div class ="holder">
    <a href="http://google.com/candidates/2021_05/mohamed_nagy_b3b03cbe"><div class="button" id="generate">Send Get Info</div></a>
  </div>
  <div class ="entry">
    <div class = "title">Most Recent Entry</div>
   <div id = "Holder">
   <div id = "Info"></div>
  </div>
  </div>
  </div>
<script src="app.js" type="text/javascript"></script>
</body>
</html>

服务器只是告诉我无法获取,因为此服务器上未找到 404

【问题讨论】:

  • 你能告诉我们你到目前为止在代码方面尝试了什么吗?
  • 我写了服务器端代码@Gaëtan Boyals,不想写无聊的问题我想要任何想法或任何帮助
  • 我看到了你的 server.js,它对我来说似乎是有效的 JS 代码,除了它不是真正的“服务器”代码,因为它是在浏览器中执行的。但是,我仍然没有足够的上下文来完全回答您的问题:您的 html 代码是什么样的?如果您只需要检索数据(如您的第一句话所述),为什么会有 POST 请求?你到底想达到什么目的?代码在哪里崩溃?我非常愿意提供帮助,但您必须先帮助我充分了解您的问题。
  • 真的很感谢你,我的兄弟,这是客户端代码或 app.js 或任何名称我的问题,他们希望我访问他们网站上的资源以便能够联系到他们并联系他们给了我三个部分的链接,我将重新附加所有部分,@Gaëtan Boyals
  • 感谢上下文,午饭回来我会写详细的回答。

标签: javascript html


【解决方案1】:

您可以在这里和那里改进一些事情。好像是学生练习,题目没有具体说明你应该用什么方法来实现你的解决方案,所以我们走最快的路线。

您不需要服务器端代码

您必须获取“candidates/2021_05/mohamed_nagy_b3b03cbe”资源 来自网站服务:https://hire.verkata.com/askme/ 进行 GET 上面的请求看起来就像您通过以下链接发送它一样 来自http://google.com/candidates/mohamed_nagy 的资源使用 在 Android 手机上运行的 Chrome 浏览器。否则,Web 服务 会给你一个拒绝访问错误。

主题并没有说明你必须对获取到 URL https://hire.verkata.com/askme/ 的数据做什么,所以我假设你只需要显示它们。

在这种情况下,您不需要整个 server.js 文件。 Express.js 是一个用于构建各种东西的 Web 框架,尤其是 API 和 Web 应用程序,但由于您似乎不需要路由或后端应用程序,因此您可以抓取它。

可接受的 HTML/JS

同样,由于该主题没有提及任何内容(并且由于它可能不会在任何类型的生产环境中使用),您只需将所有代码放在一个 HTML 文件中,它就可以正常工作预计。

这就是我要做的。 (请记住,下面的代码一点也不专业,我们走的是最快的路线,因此标题中的可接受

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Fetch API</title>
  <link href="https://fonts.googleapis.com/css?family=Oswald:400,600,700|Ranga:400,700&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="style.css">
  <!--[if lt IE 9]>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.js"></script>
  <![endif]-->
</head>
<body>
<div id="app">
  <div class="holder">
    <button class="button" id="call-server">Send Get Info</button>
  </div>
  <div class="entry">
    <div class="title">Most Recent Entry</div>
    <div id="holder">
      <div id="display-info"></div>
    </div>
  </div>
</div>
</body>
<script>
  let button = document.getElementById('call-server');
  let info = document.getElementById('display-info');
  const key = 'candidates/2021_05/mohamed_nagy_b3b03cbe';
  const url = 'https://hire.verkata.com/askme/';

  button.addEventListener('click', () => {
    fetchWeather(`${url}${key}`)
      .then((data) => {
        console.log(data);
        info.innerHTML = data;
      }).catch((err) => {
      console.error(err);
    })
  });

  const fetchOpts = { method: 'GET',
    referrer: "http://google.com/candidates/mohamed_nagy",
  };
  const fetchWeather = async (fullUrl) => {
    try {
      const res = await fetch(fullUrl, fetchOpts)
      return await res.json();
    } catch (error) {
      console.log("Error:", error) // appropriately handle the error
    }
  };
</script>
</html>

我采用了您的代码并对其进行了简化。不需要&lt;a&gt; 标签,它会将您重定向到您在href 属性中提供的链接。他们的意思是什么

通过从http://google.com/candidates/mohamed_nagy 指向资源的链接,使上面的 GET 请求看起来就像您正在发送它一样

正在设置请求中的referrer 标头。有关此herehere 的更多信息。

但截至本答案发布时它仍然无法正常工作,这就是(部分)原因。

他们的问题是什么

当使用浏览器导航到您在帖子中提供的完整 URL 时,我们可以看到直接从 PHP 弹出一个错误:

注意:未定义索引:/var/www/html/hire/actions/requests.php 第 34 行中的 HTTP_REFERER

这个错误说明服务器在请求中找不到标头referer。正如this answer 所述,referer 标头不是保证由浏览器发送的。

不幸的是,无论是否设置了referer 标头,都会弹出相同的错误。我尝试了几乎所有referrerreferrerPolicy 的组合,似乎它从来没有让我访问任何东西。

在任何情况下,这都是他们一方未捕获的错误,无论如何都不应向最终用户显示此错误。

结论

尝试仔细检查您尝试访问的网址,看看是否有任何拼写错误。如果您 100% 确定该 URL,请尝试联系 https://hire.verkata.com 的所有者或开发人员,并告诉他们他们在检查 referer 标头时有一个未捕获的错误。

【讨论】:

  • 感谢您的努力兄弟,非常感谢您的努力我已经完成了相同的解决方案,似乎时间已经过去了,因为它是一个定时任务,所以它已经从这个资源中消失或删除了网站,临时资源,无论如何很高兴与您交谈@Gaëtan Boyals
【解决方案2】:

尝试在你的 HTML 代码中添加这个

    <a href="http://google.com/candidates/2021_05/mohamed_nagy_b3b03cbe"><div class="button" id="generate">Send Get Info</div></a>       

instead if this in the address :    
           <a href="http://google.com/candidates/2021_05/mohamed_nagy_b3b03cbe"><div class="button" id="generate">Send Get Info</div></a>       

to this    
        <a href="https://hire.verkata.com/askme/candidates/2021_05/mohamed_nagy_b3b03cbe"><div class="button" id="generate">Send Get Info</div></a>       

or just change the href attribute to 
    href="#"            



    

    

     

【讨论】:

  • google.com/candidates/mohamed_nagy, Candidates/2021_05/mohamed_nagy_b3b03cbe hire.verkata.com/askme 我已经改变了一切并且尝试了每个组合,我认为这不是我的问题,问题是如何在 routs 中使用链接的三个部分除了使用其他链接将所有链接组合在一起的获取之外,还从单击的 href 中获取
【解决方案3】:

您不需要服务器端代码。实际上,您不需要编写任何代码来发出 GET 请求。

您可以使用 API 客户端工具,例如 Postman。

请求应采用以下格式:

  • 方法:GET
  • 引用者:“http://google.com/candidates/mohamed_nagy”,
  • 用户代理:“Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Mobile Safari/537.36”

(需要 User-Agent 来模拟运行在 Android 手机上的 Chrome 浏览器。)

因此,您会收到回复,“您需要在收到电子邮件后的 72 小时内取回拼图”。

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多