Skip to content

Commit 9c87948

Browse files
authored
Merge pull request #4 from jblanked/dev_1.0
Web Crawler - v1.0
2 parents c651762 + f9a1bfe commit 9c87948

25 files changed

+3320
-1517
lines changed

.DS_Store

-8 KB
Binary file not shown.

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 1.0
2+
- Updated the HTTP Method toggle to work as intended.
3+
- Updated FlipperHTTP to the latest version.
4+
- Improved memory allocation
5+
- Fixed loading diplay messages.
6+
- Added a BROWSE method, which fetches HTML data from the specified path, parses the HTML, then displays the data as a "webpage".
7+
18
## 0.8
29
Updates from Derek Jamison:
310
- Improved progress display.

README.md

+4-22
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
## Overview
2-
3-
**Web Crawler** is a custom application designed for the Flipper Zero device, allowing users to configure and manage HTTP requests directly from their Flipper Zero.
1+
Browse the web, fetch API data, and more on your Flipper Zero.
42

53
## Requirements
6-
- WiFi Dev Board or Raspberry Pi Pico W for Flipper Zero with FlipperHTTP Flash: https://github.com/jblanked/FlipperHTTP
7-
- WiFi Access Point
8-
4+
- WiFi Developer Board, Raspberry Pi, or ESP32 device flashed with FlipperHTTP version 1.6 or higher: https://github.com/jblanked/FlipperHTTP
5+
- 2.4 GHz WiFi Access Point
96

107
## Installation
118
- Download from the Official Flipper App Store: https://lab.flipper.net/apps/web_crawler
@@ -52,7 +49,7 @@
5249
- Enter the complete URL of the website you intend to crawl (e.g., https://www.example.com/).
5350

5451
2. **HTTP Method**
55-
- Choose between GET, POST, DELETE, PUT, and DOWNLOAD.
52+
- Choose between GET, POST, DELETE, PUT, DOWNLOAD, and BROWSE.
5653

5754
3. **Headers**
5855
- Add your required headers to be used in your HTTP requests
@@ -73,19 +70,4 @@
7370
- Provide your desired file name. After saving, the app will rename your file with the new name.
7471

7572

76-
## Saving Settings
77-
After entering the desired configuration parameters, the app automatically saves these settings for use during the HTTP request process. You can update these settings at any time by navigating back to the **Settings** menu.
78-
79-
## Logging and Debugging
80-
The Web Crawler app uses logging to help identify issues:
81-
82-
- **Info Logs**: Provide general information about the app's operations (e.g., UART initialization, sending settings).
83-
- **Error Logs**: Indicate problems encountered during execution (e.g., failed to open settings file).
84-
85-
Connect your Flipper Zero to a computer and use a serial terminal to view these logs for detailed troubleshooting.
86-
87-
## Known Issues
88-
1. **Screen Delay**: Occasionally, the Run screen may get stuck on "Receiving Data".
89-
- If it takes longer than 10 seconds, restart your Flipper Zero.
90-
9173
*Happy Crawling! 🕷️*

alloc/web_crawler_alloc.c

+1-280
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@ WebCrawlerApp *web_crawler_app_alloc()
1212
// Open GUI
1313
Gui *gui = furi_record_open(RECORD_GUI);
1414

15-
// Initialize UART with the correct callback
16-
if (!flipper_http_init(flipper_http_rx_callback, app))
17-
{
18-
FURI_LOG_E(TAG, "Failed to initialize UART");
19-
return NULL;
20-
}
21-
2215
// Allocate ViewDispatcher
2316
if (!easy_flipper_set_view_dispatcher(&app->view_dispatcher, gui, app))
2417
{
@@ -27,54 +20,7 @@ WebCrawlerApp *web_crawler_app_alloc()
2720
view_dispatcher_set_custom_event_callback(app->view_dispatcher, web_crawler_custom_event_callback);
2821

2922
// Allocate and initialize temp_buffer and path
30-
app->temp_buffer_size_path = 128;
31-
app->temp_buffer_size_ssid = 64;
32-
app->temp_buffer_size_password = 64;
33-
app->temp_buffer_size_file_type = 16;
34-
app->temp_buffer_size_file_rename = 128;
3523
app->temp_buffer_size_http_method = 16;
36-
app->temp_buffer_size_headers = 256;
37-
app->temp_buffer_size_payload = 256;
38-
if (!easy_flipper_set_buffer(&app->temp_buffer_path, app->temp_buffer_size_path))
39-
{
40-
return NULL;
41-
}
42-
if (!easy_flipper_set_buffer(&app->path, app->temp_buffer_size_path))
43-
{
44-
return NULL;
45-
}
46-
if (!easy_flipper_set_buffer(&app->temp_buffer_ssid, app->temp_buffer_size_ssid))
47-
{
48-
return NULL;
49-
}
50-
if (!easy_flipper_set_buffer(&app->ssid, app->temp_buffer_size_ssid))
51-
{
52-
return NULL;
53-
}
54-
if (!easy_flipper_set_buffer(&app->temp_buffer_password, app->temp_buffer_size_password))
55-
{
56-
return NULL;
57-
}
58-
if (!easy_flipper_set_buffer(&app->password, app->temp_buffer_size_password))
59-
{
60-
return NULL;
61-
}
62-
if (!easy_flipper_set_buffer(&app->temp_buffer_file_type, app->temp_buffer_size_file_type))
63-
{
64-
return NULL;
65-
}
66-
if (!easy_flipper_set_buffer(&app->file_type, app->temp_buffer_size_file_type))
67-
{
68-
return NULL;
69-
}
70-
if (!easy_flipper_set_buffer(&app->temp_buffer_file_rename, app->temp_buffer_size_file_rename))
71-
{
72-
return NULL;
73-
}
74-
if (!easy_flipper_set_buffer(&app->file_rename, app->temp_buffer_size_file_rename))
75-
{
76-
return NULL;
77-
}
7824
if (!easy_flipper_set_buffer(&app->temp_buffer_http_method, app->temp_buffer_size_http_method))
7925
{
8026
return NULL;
@@ -83,104 +29,9 @@ WebCrawlerApp *web_crawler_app_alloc()
8329
{
8430
return NULL;
8531
}
86-
if (!easy_flipper_set_buffer(&app->temp_buffer_headers, app->temp_buffer_size_headers))
87-
{
88-
return NULL;
89-
}
90-
if (!easy_flipper_set_buffer(&app->headers, app->temp_buffer_size_headers))
91-
{
92-
return NULL;
93-
}
94-
if (!easy_flipper_set_buffer(&app->temp_buffer_payload, app->temp_buffer_size_payload))
95-
{
96-
return NULL;
97-
}
98-
if (!easy_flipper_set_buffer(&app->payload, app->temp_buffer_size_payload))
99-
{
100-
return NULL;
101-
}
102-
103-
// Allocate TextInput views
104-
if (!easy_flipper_set_uart_text_input(&app->text_input_path, WebCrawlerViewTextInput, "Enter URL", app->temp_buffer_path, app->temp_buffer_size_path, NULL, web_crawler_back_to_request_callback, &app->view_dispatcher, app))
105-
{
106-
return NULL;
107-
}
108-
if (!easy_flipper_set_uart_text_input(&app->text_input_ssid, WebCrawlerViewTextInputSSID, "Enter SSID", app->temp_buffer_ssid, app->temp_buffer_size_ssid, NULL, web_crawler_back_to_wifi_callback, &app->view_dispatcher, app))
109-
{
110-
return NULL;
111-
}
112-
if (!easy_flipper_set_uart_text_input(&app->text_input_password, WebCrawlerViewTextInputPassword, "Enter Password", app->temp_buffer_password, app->temp_buffer_size_password, NULL, web_crawler_back_to_wifi_callback, &app->view_dispatcher, app))
113-
{
114-
return NULL;
115-
}
116-
if (!easy_flipper_set_uart_text_input(&app->text_input_file_type, WebCrawlerViewTextInputFileType, "Enter File Type", app->temp_buffer_file_type, app->temp_buffer_size_file_type, NULL, web_crawler_back_to_file_callback, &app->view_dispatcher, app))
117-
{
118-
return NULL;
119-
}
120-
if (!easy_flipper_set_uart_text_input(&app->text_input_file_rename, WebCrawlerViewTextInputFileRename, "Enter File Rename", app->temp_buffer_file_rename, app->temp_buffer_size_file_rename, NULL, web_crawler_back_to_file_callback, &app->view_dispatcher, app))
121-
{
122-
return NULL;
123-
}
124-
if (!easy_flipper_set_uart_text_input(&app->text_input_headers, WebCrawlerViewTextInputHeaders, "Enter Headers", app->temp_buffer_headers, app->temp_buffer_size_headers, NULL, web_crawler_back_to_request_callback, &app->view_dispatcher, app))
125-
{
126-
return NULL;
127-
}
128-
if (!easy_flipper_set_uart_text_input(&app->text_input_payload, WebCrawlerViewTextInputPayload, "Enter Payload", app->temp_buffer_payload, app->temp_buffer_size_payload, NULL, web_crawler_back_to_request_callback, &app->view_dispatcher, app))
129-
{
130-
return NULL;
131-
}
132-
133-
// Allocate VariableItemList views
134-
if (!easy_flipper_set_variable_item_list(&app->variable_item_list_wifi, WebCrawlerViewVariableItemListWifi, web_crawler_wifi_enter_callback, web_crawler_back_to_configure_callback, &app->view_dispatcher, app))
135-
{
136-
return NULL;
137-
}
138-
if (!easy_flipper_set_variable_item_list(&app->variable_item_list_file, WebCrawlerViewVariableItemListFile, web_crawler_file_enter_callback, web_crawler_back_to_configure_callback, &app->view_dispatcher, app))
139-
{
140-
return NULL;
141-
}
142-
if (!easy_flipper_set_variable_item_list(&app->variable_item_list_request, WebCrawlerViewVariableItemListRequest, web_crawler_request_enter_callback, web_crawler_back_to_configure_callback, &app->view_dispatcher, app))
143-
{
144-
return NULL;
145-
}
146-
147-
// set variable items
148-
app->path_item = variable_item_list_add(app->variable_item_list_request, "Path", 0, NULL, NULL);
149-
app->http_method_item = variable_item_list_add(app->variable_item_list_request, "HTTP Method", 5, web_crawler_http_method_change, app);
150-
app->headers_item = variable_item_list_add(app->variable_item_list_request, "Headers", 0, NULL, NULL);
151-
app->payload_item = variable_item_list_add(app->variable_item_list_request, "Payload", 0, NULL, NULL);
152-
//
153-
app->ssid_item = variable_item_list_add(app->variable_item_list_wifi, "SSID", 0, NULL, NULL); // index 0
154-
app->password_item = variable_item_list_add(app->variable_item_list_wifi, "Password", 0, NULL, NULL); // index 1
155-
//
156-
app->file_read_item = variable_item_list_add(app->variable_item_list_file, "Read File", 0, NULL, NULL); // index 0
157-
app->file_type_item = variable_item_list_add(app->variable_item_list_file, "Set File Type", 0, NULL, NULL); // index 1
158-
app->file_rename_item = variable_item_list_add(app->variable_item_list_file, "Rename File", 0, NULL, NULL); // index 2
159-
app->file_delete_item = variable_item_list_add(app->variable_item_list_file, "Delete File", 0, NULL, NULL); // index 3
160-
161-
if (!app->ssid_item || !app->password_item || !app->file_type_item || !app->file_rename_item || !app->path_item || !app->file_read_item || !app->file_delete_item || !app->http_method_item || !app->headers_item || !app->payload_item)
162-
{
163-
free_all(app, "Failed to add items to VariableItemList");
164-
return NULL;
165-
}
166-
167-
variable_item_set_current_value_text(app->path_item, ""); // Initialize
168-
variable_item_set_current_value_text(app->http_method_item, ""); // Initialize
169-
variable_item_set_current_value_text(app->headers_item, ""); // Initialize
170-
variable_item_set_current_value_text(app->payload_item, ""); // Initialize
171-
variable_item_set_current_value_text(app->ssid_item, ""); // Initialize
172-
variable_item_set_current_value_text(app->password_item, ""); // Initialize
173-
variable_item_set_current_value_text(app->file_type_item, ""); // Initialize
174-
variable_item_set_current_value_text(app->file_rename_item, ""); // Initialize
175-
variable_item_set_current_value_text(app->file_read_item, ""); // Initialize
176-
variable_item_set_current_value_text(app->file_delete_item, ""); // Initialize
17732

17833
// Allocate Submenu views
179-
if (!easy_flipper_set_submenu(&app->submenu_main, WebCrawlerViewSubmenuMain, "Web Crawler v0.8", web_crawler_exit_app_callback, &app->view_dispatcher))
180-
{
181-
return NULL;
182-
}
183-
if (!easy_flipper_set_submenu(&app->submenu_config, WebCrawlerViewSubmenuConfig, "Settings", web_crawler_back_to_main_callback, &app->view_dispatcher))
34+
if (!easy_flipper_set_submenu(&app->submenu_main, WebCrawlerViewSubmenuMain, VERSION_TAG, web_crawler_exit_app_callback, &app->view_dispatcher))
18435
{
18536
return NULL;
18637
}
@@ -190,147 +41,17 @@ WebCrawlerApp *web_crawler_app_alloc()
19041
submenu_add_item(app->submenu_main, "About", WebCrawlerSubmenuIndexAbout, web_crawler_submenu_callback, app);
19142
submenu_add_item(app->submenu_main, "Settings", WebCrawlerSubmenuIndexConfig, web_crawler_submenu_callback, app);
19243

193-
submenu_add_item(app->submenu_config, "WiFi", WebCrawlerSubmenuIndexWifi, web_crawler_submenu_callback, app);
194-
submenu_add_item(app->submenu_config, "File", WebCrawlerSubmenuIndexFile, web_crawler_submenu_callback, app);
195-
submenu_add_item(app->submenu_config, "Request", WebCrawlerSubmenuIndexRequest, web_crawler_submenu_callback, app);
196-
19744
// Main view
19845
if (!easy_flipper_set_view(&app->view_loader, WebCrawlerViewLoader, web_crawler_loader_draw_callback, NULL, web_crawler_back_to_main_callback, &app->view_dispatcher, app))
19946
{
20047
return NULL;
20148
}
20249
web_crawler_loader_init(app->view_loader);
203-
204-
//-- WIDGET ABOUT VIEW --
205-
if (!easy_flipper_set_widget(&app->widget_about, WebCrawlerViewAbout, "Web Crawler App\n---\nThis is a web crawler app for Flipper Zero.\n---\nVisit github.com/jblanked for more details.\n---\nPress BACK to return.", web_crawler_back_to_main_callback, &app->view_dispatcher))
206-
{
207-
return NULL;
208-
}
209-
if (!easy_flipper_set_widget(&app->widget_file_read, WebCrawlerViewFileRead, "Data will be displayed here.", web_crawler_back_to_file_callback, &app->view_dispatcher))
210-
{
211-
return NULL;
212-
}
213-
if (!easy_flipper_set_widget(&app->widget_file_delete, WebCrawlerViewFileDelete, "File deleted.", web_crawler_back_to_file_callback, &app->view_dispatcher))
214-
{
215-
return NULL;
216-
}
21750
if (!easy_flipper_set_widget(&app->widget_result, WebCrawlerViewWidgetResult, "Error, try again.", web_crawler_back_to_main_callback, &app->view_dispatcher))
21851
{
21952
return NULL;
22053
}
22154

222-
// Load Settings and Update Views
223-
if (!load_settings(
224-
app->path,
225-
app->temp_buffer_size_path,
226-
app->ssid,
227-
app->temp_buffer_size_ssid,
228-
app->password,
229-
app->temp_buffer_size_password,
230-
app->file_rename,
231-
app->temp_buffer_size_file_rename,
232-
app->file_type,
233-
app->temp_buffer_size_file_type,
234-
app->http_method,
235-
app->temp_buffer_size_http_method,
236-
app->headers,
237-
app->temp_buffer_size_headers,
238-
app->payload,
239-
app->temp_buffer_size_payload,
240-
app))
241-
{
242-
FURI_LOG_E(TAG, "Failed to load settings");
243-
}
244-
else
245-
{
246-
// Update the configuration items based on loaded settings
247-
if (app->path_item)
248-
{
249-
variable_item_set_current_value_text(app->path_item, app->path);
250-
}
251-
else
252-
{
253-
variable_item_set_current_value_text(app->path_item, "https://httpbin.org/get"); // Initialize
254-
}
255-
256-
if (app->ssid_item)
257-
{
258-
variable_item_set_current_value_text(app->ssid_item, app->ssid);
259-
}
260-
else
261-
{
262-
variable_item_set_current_value_text(app->ssid_item, ""); // Initialize
263-
}
264-
265-
if (app->file_type_item)
266-
{
267-
variable_item_set_current_value_text(app->file_type_item, app->file_type);
268-
}
269-
else
270-
{
271-
variable_item_set_current_value_text(app->file_type_item, ".txt"); // Initialize
272-
}
273-
274-
if (app->file_rename_item)
275-
{
276-
variable_item_set_current_value_text(app->file_rename_item, app->file_rename);
277-
}
278-
else
279-
{
280-
variable_item_set_current_value_text(app->file_rename_item, "received_data"); // Initialize
281-
}
282-
283-
if (app->http_method_item)
284-
{
285-
variable_item_set_current_value_text(app->http_method_item, app->http_method);
286-
}
287-
else
288-
{
289-
variable_item_set_current_value_text(app->http_method_item, "GET"); // Initialize
290-
}
291-
292-
if (app->headers_item)
293-
{
294-
variable_item_set_current_value_text(app->headers_item, app->headers);
295-
}
296-
else
297-
{
298-
variable_item_set_current_value_text(app->headers_item, "{\n\t\"Content-Type\": \"application/json\"\n}"); // Initialize
299-
}
300-
301-
if (app->payload_item)
302-
{
303-
variable_item_set_current_value_text(app->payload_item, app->payload);
304-
}
305-
else
306-
{
307-
variable_item_set_current_value_text(app->payload_item, "{\n\t\"key\": \"value\"\n}"); // Initialize
308-
}
309-
310-
// set the file path for fhttp.file_path
311-
char file_path[128];
312-
snprintf(file_path, sizeof(file_path), "%s%s%s", RECEIVED_DATA_PATH, app->file_rename, app->file_type);
313-
snprintf(fhttp.file_path, sizeof(fhttp.file_path), "%s", file_path);
314-
315-
// update temp buffers
316-
strncpy(app->temp_buffer_path, app->path, app->temp_buffer_size_path - 1);
317-
app->temp_buffer_path[app->temp_buffer_size_path - 1] = '\0';
318-
strncpy(app->temp_buffer_ssid, app->ssid, app->temp_buffer_size_ssid - 1);
319-
app->temp_buffer_ssid[app->temp_buffer_size_ssid - 1] = '\0';
320-
strncpy(app->temp_buffer_file_type, app->file_type, app->temp_buffer_size_file_type - 1);
321-
app->temp_buffer_file_type[app->temp_buffer_size_file_type - 1] = '\0';
322-
strncpy(app->temp_buffer_file_rename, app->file_rename, app->temp_buffer_size_file_rename - 1);
323-
app->temp_buffer_file_rename[app->temp_buffer_size_file_rename - 1] = '\0';
324-
strncpy(app->temp_buffer_http_method, app->http_method, app->temp_buffer_size_http_method - 1);
325-
app->temp_buffer_http_method[app->temp_buffer_size_http_method - 1] = '\0';
326-
strncpy(app->temp_buffer_headers, app->headers, app->temp_buffer_size_headers - 1);
327-
app->temp_buffer_headers[app->temp_buffer_size_headers - 1] = '\0';
328-
strncpy(app->temp_buffer_payload, app->payload, app->temp_buffer_size_payload - 1);
329-
app->temp_buffer_payload[app->temp_buffer_size_payload - 1] = '\0';
330-
331-
// Password handling can be omitted for security or handled securely
332-
}
333-
33455
// Start with the Submenu view
33556
view_dispatcher_switch_to_view(app->view_dispatcher, WebCrawlerViewSubmenuMain);
33657

0 commit comments

Comments
 (0)