App::CekBpom - Check registered products & manufacturers (CLIs for cekbpom.pom.go.id)
This document describes version 0.022 of App::CekBpom (from Perl distribution App-CekBpom), released on 2022-05-26.
See included script cek-bpom-products and cek-bpom-manufacturers.
Usage:
cek_bpom_products(%args) -> [$status_code, $reason, $payload, \%result_meta]
Search BPOM products via https://cekbpom.pom.go.id/.
Examples:
By default search against name (nama_produk) and brand (merk):
cek_bpom_products(queries => ["hichew", "hi-chew", "hi chew"]);
Uses LWP::UserAgent::Plugin so you can add retry, caching, or additional HTTP client behavior by setting LWP_USERAGENT_PLUGINS environment variable.
LWP_USERAGENT_PLUGINS
This function is not exported by default, but exportable.
Arguments ('*' denotes required arguments):
get_product_detail => bool
For each product (search result), fetch the detail. This currently fetches the manufacturer ("produsen"), which is not displayed by the search result page. Note that this requires a separate HTTP request for each product so can potentially take a long time and might get you banned. Suggestions include: (1) searching without this option first to find out the number of results, then search again with this option if you need it; (2) use LWP::UserAgent::Plugin::Delay to throttle your HTTP requests.
note => str
Add note.
This will not be sent as queries, but will be added to the log file if log file is specified, as well as added to the result dump file name, in encoded form.
queries* => array[str]
query_log_file => filename
Log queries to log file.
If specified, each invocation of this utility will be logged into a line in the specified file path, in TSV format. Tab character in the query will be converted into 4 spaces, to avoid clash with the use of Tab as field separator.
For example, this invocation:
% cek-bpom-products "minuman susu fermentasi" yakult --query-log-file /some/path.txt
Sample log line:
time:2020-10-22T01:02:03.000Z queries:minuman susu fermentasi,yakult search_types:merk,nama_produk num_results:51 duration:3.402
result_dump_dir => dirname
Dump result to directory.
If specified, will dump full enveloped result to a file in specified directory path, in JSON format. The JSON formatting makes it easy to grep each row. The file will be named cek-bpom-products-result.<encoded-timestamp>.<search-types-encoded>.<queries-encoded>(.<note-encoded>)?.json. The encoded timestamp is ISO 8601 format with colon replaced by underscore. The encoded query will replace all every group of "unsafe" characters in query with a single dash. The same goes with encoded note, which comes from the note argument. For example, this invocation:
cek-bpom-products-result.<encoded-timestamp>.<search-types-encoded>.<queries-encoded>(.<note-encoded>)?.json
note
% cek-bpom-products "minuman susu fermentasi" yakult --note "some note"
will result in a result dump file name like: cek-bpom-products-result.2020-10-22T01_02_03.000Z.merk-nama_produk.minuman-susu-fermentasi-yakult.some-note.json.
cek-bpom-products-result.2020-10-22T01_02_03.000Z.merk-nama_produk.minuman-susu-fermentasi-yakult.some-note.json
search_types => array[str]
Select what field(s) to search against.
By default, if not specified, will search against product name ("nama_produk") and brand ("merk"). If you specify multiple times, it will search against all those types, e.g.:
--search-type nama_produk --search-type nama_pendaftar
or:
--nama-produk --nama-pendaftar
Note: the mobile app version allows you to search for products by original manufacturer ("produsen") as well, which is not available in the website version. The website allows you to search for producers ("sarana") by name/address/city/province/country, though, and lets you view what products are registered for that producer.
This utility will allow you to fetch the detail of each product, including manufacturer (see --get-product-detail option).
--get-product-detail
Returns an enveloped result (an array).
First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.
Return value: (any)
Please visit the project's homepage at https://metacpan.org/release/App-CekBpom.
Source repository is at https://github.com/perlancar/perl-App-CekBpom.
https://cekbpom.pom.go.id/
perlancar <perlancar@cpan.org>
To contribute, you can send patches by email/via RT, or send pull requests on GitHub.
Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via:
% prove -l
If you want to build the distribution (e.g. to try to install it locally on your system), you can install Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, and sometimes one or two other Dist::Zilla plugin and/or Pod::Weaver::Plugin. Any additional steps required beyond that are considered a bug and can be reported to me.
This software is copyright (c) 2022, 2021, 2020 by perlancar <perlancar@cpan.org>.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=App-CekBpom
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
To install App::CekBpom, copy and paste the appropriate command in to your terminal.
cpanm
cpanm App::CekBpom
CPAN shell
perl -MCPAN -e shell install App::CekBpom
For more information on module installation, please visit the detailed CPAN module installation guide.