Skip to content

Commit 582d011

Browse files
authored
Merge pull request #9 from erhopf/master
Bing Web Search - Tutorial Code Updates
2 parents 953ebb3 + 1b97f95 commit 582d011

File tree

8 files changed

+635
-591
lines changed

8 files changed

+635
-591
lines changed

.DS_Store

6 KB
Binary file not shown.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Bing Web Search single-page app
2+
3+
This single-page app demonstrates how the Bing Web Search API can be used to retrieve, parse, and display relevant search results based on a user's query. HTML, CSS, and JS files are included. Express.js is the only dependency.
4+
5+
The sample app can:
6+
7+
* Call the Bing Web Search API with search options
8+
* Display web, image, news, and video results
9+
* Paginate results
10+
* Manage subscription keys
11+
* Handle errors
12+
13+
To use this app, an [Azure Cognitive Services account](https://docs.microsoft.com/azure/cognitive-services/cognitive-services-apis-create-account) with Bing Search APIs is required. If you don't have an account, you can use the [free trial](https://azure.microsoft.com/try/cognitive-services/?api=bing-web-search-api) to get a subscription key.
14+
15+
## Prerequisites
16+
17+
Here are a few things that you'll to run the app:
18+
19+
* Node.js 8 or later
20+
* A subscription key
21+
22+
## Get started
23+
24+
1. Clone the repository.
25+
2. Navigate to the Bing Web Search Tutorial directory.
26+
3. Install dependencies:
27+
```
28+
npm install
29+
```
30+
4. Run the sample app:
31+
```
32+
node bing-web-search.js
33+
```
34+
5. Navigate to the provided URL and perform your first Bing Web Search!
35+
36+
## Next steps
37+
38+
Learn how the app works with the [single-page web app tutorial](https://docs.microsoft.com/en-us/azure/cognitive-services/bing-web-search/tutorial-bing-web-search-single-page-app).
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const https = require('https');
2+
const express = require("express");
3+
const app = express();
4+
var port = 8000;
5+
6+
app.use(express.static("public"));
7+
8+
app.listen(port, () => console.log('Your app is ready! Navigate to: http://localhost:' + port + '/.'));
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"name": "bing-web-search",
3+
"version": "1.0.0",
4+
"description": "A single-page web app that displays Bing Web Search results, including pages, images, news articles, and video thumbnails.",
5+
"main": "bing-web-search.js",
6+
"dependencies": {
7+
"express": "^4.16.3"
8+
},
9+
"devDependencies": {},
10+
"scripts": {
11+
"test": "node bing-web-search.js"
12+
},
13+
"author": "Microsoft Corporation"
14+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
html, body, div, p, h1, h2 {font-family: Verdana, "Lucida Sans", sans-serif; color: #000;}
2+
html, body, div, p {font-weight: normal;}
3+
body {background-color: #fff;}
4+
5+
h1, h2, h3 {font-weight: bold; color: #087;}
6+
sup {font-weight: normal;}
7+
8+
html, body, div, p {font-size: 12px;}
9+
h1 {font-size: 20px; margin-top: 30px;}
10+
h2 {font-size: 16px; clear: left;}
11+
h3 {font-size: 14px; clear: left;}
12+
13+
#sidebar {font-size: 10px; text-align: right; display: flex; padding: 0px 10px;
14+
float: right; margin-left: 15px; margin-right: 0px;}
15+
#sidebar p {margin-top: 0px; font-size: 10px;}
16+
#sidebar img {display: inline-block; float: none; padding-right: 0px;}
17+
#pole p {font-size: 14px;}
18+
#pole, #mainline, #json, #http, #sidebar, #error, #paging1, #paging2
19+
{display: none;}
20+
21+
#term {width: 100%;}
22+
#logo {padding: 15px; float: right; border-left: 2px solid #ccc;}
23+
#query {float: left;}
24+
25+
img {vertical-align: top; float: left; margin-right: 10px; margin-bottom: 10px;}
26+
p.images img {float: none;}
27+
p.relatedSearches {clear: none;}
28+
#logo p, p.news, p.webPages, p.images {clear: left;}
29+
30+
a[href="#"]:link {color: blue;}
31+
a[href="#"]:visited {color: blue;}
32+
33+
h3 a:visited {color: #087 !important;}
34+
h3 a:link {color: #087 !important;}
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Bing Web Search API Tutorial</title>
6+
<base target="_blank">
7+
<link rel="stylesheet" href="/css/styles.css">
8+
<script src="/js/script.js"></script>
9+
</head>
10+
<body onload="document.forms.bing.query.focus();">
11+
12+
<form name="bing" onsubmit="this.offset.value = 0; return bingWebSearch(this.query.value,
13+
bingSearchOptions(this), getSubscriptionKey())">
14+
15+
<div id="logo"><!-- logo block including search market/language -->
16+
<img src="data:image/png;base64,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">
17+
<I>api</I>
18+
<p><select name="where">
19+
<option value="es-AR">Argentina (Spanish)</option>
20+
<option value="en-AU">Australia (English)</option>
21+
<option value="de-AT">Austria (German)</option>
22+
<option value="nl-BE">Belgium (Dutch)</option>
23+
<option value="fr-BE">Belgium (French)</option>
24+
<option value="pt-BR">Brazil (Portuguese)</option>
25+
<option value="en-CA">Canada (English)</option>
26+
<option value="fr-CA">Canada (French)</option>
27+
<option value="es-CL">Chile (Spanish)</option>
28+
<option value="da-DK">Denmark (Danish)</option>
29+
<option value="fi-FI">Finland (Finnish)</option>
30+
<option value="fr-FR">France (French)</option>
31+
<option value="de-DE">Germany (German)</option>
32+
<option value="zh-HK">Hong Kong (Traditional Chinese)</option>
33+
<option value="en-IN">India (English)</option>
34+
<option value="en-ID">Indonesia (English)</option>
35+
<option value="it-IT">Italy (Italian)</option>
36+
<option value="ja-JP">Japan (Japanese)</option>
37+
<option value="ko-KR">Korea (Korean)</option>
38+
<option value="en-MY">Malaysia (English)</option>
39+
<option value="es-MX">Mexico (Spanish)</option>
40+
<option value="nl-NL">Netherlands (Dutch)</option>
41+
<option value="en-NZ">New Zealand (English)</option>
42+
<option value="no-NO">Norway (Norwegian)</option>
43+
<option value="zh-CN">People's Republic of China (Chinese)</option>
44+
<option value="pl-PL">Poland (Polish)</option>
45+
<option value="pt-PT">Portugal (Portuguese)</option>
46+
<option value="en-PH">Philippines (English)</option>
47+
<option value="ru-RU">Russia (Russian)</option>
48+
<option value="ar-SA">Saudi Arabia (Arabic)</option>
49+
<option value="en-ZA">South Africa (English)</option>
50+
<option value="es-ES">Spain (Spanish)</option>
51+
<option value="sv-SE">Sweden (Swedish)</option>
52+
<option value="fr-CH">Switzerland (French)</option>
53+
<option value="de-CH">Switzerland (German)</option>
54+
<option value="zh-TW">Taiwan (Traditional Chinese)</option>
55+
<option value="tr-TR">Turkey (Turkish)</option>
56+
<option value="en-GB">United Kingdom (English)</option>
57+
<option value="en-US" selected>United States (English)</option>
58+
<option value="es-US">United States (Spanish)</option>
59+
</select>
60+
<p>from Microsoft Cognitive Services
61+
</div>
62+
63+
<div id="query"><!-- query controls including search field and options -->
64+
<h1>Bing Web Search API demo</h2>
65+
66+
<input type="text" name="query" id="term" placeholder="Search the Web" autocomplete=off>
67+
68+
<p>Promote
69+
<input type=checkbox name="what" id="webpages" value="webpages">
70+
<label for="webpages">Web pages</label>
71+
<input type=checkbox name="what" id="news" value="news">
72+
<label for="news">News</label>
73+
<input type=checkbox name="what" id="images" value="images">
74+
<label for="images">Images</label>
75+
<input type=checkbox name="what" id="videos" value="videos">
76+
<label for="videos">Videos</label>
77+
78+
&nbsp;&nbsp;&nbsp;From
79+
<select name="when">
80+
<option value="" selected>All time</option>
81+
<option value="month">Past month</option>
82+
<option value="week">Past week</option>
83+
<option value="day">Last 24 hours</option>
84+
</select>
85+
86+
&nbsp;&nbsp;&nbsp;<input type=checkbox id="safe" name="safe" value="on" checked><label for="safe">SafeSearch</label>
87+
88+
<!-- these hidden fields control paging -->
89+
<input type=hidden name="count" value="25">
90+
<input type=hidden name="offset" value="0">
91+
92+
</form>
93+
94+
</div>
95+
<div id="error">
96+
<h2>Error</h2>
97+
<div id="_error">
98+
</div>
99+
</div>
100+
101+
<h2>Results</h2>
102+
<div id="paging1">
103+
<div id="_paging1"></div>
104+
</div>
105+
106+
<div id="noresults">
107+
<div id="_noresults">None yet.</div>
108+
</div>
109+
110+
<div id="sidebar">
111+
<div id="_sidebar"></div>
112+
</div>
113+
114+
<div id="pole">
115+
<div id="_pole"></div>
116+
</div>
117+
118+
<div id="mainline">
119+
<div id="_mainline"></div>
120+
</div>
121+
122+
<div id="paging2">
123+
<div id="_paging2"></div>
124+
</div>
125+
126+
<div id="json">
127+
<h3><a href="#" onclick="return toggleDisplay('_json')">JSON</a></h3>
128+
<div id="_json" style="display: none"></div>
129+
</div>
130+
131+
<div id="http">
132+
<h3><a href="#" onclick="return toggleDisplay('_http')">HTTP</a></h3>
133+
<div id="_http" style="display: none"></div>
134+
</div>
135+
136+
</body>
137+
</html>

0 commit comments

Comments
 (0)