In a Support thread titled “Change max chars in Onebox - enlarge your Onebox?”, frold seeks to expand the Amazon Onebox description limit beyond the default 200–250 characters. maja, who enhanced the Amazon Onebox, confirms the limit is hardcoded and tied to mobile-excerpted content, not configurable per engine. frold explores modifying amazon_onebox.rb and discovers the description is truncated server-side by Amazon’s mobile view. He later finds the full description is available under #productDescription_fullView and submits a pull request to use it. Despite testing locally and adjusting DEFAULTS[:MAX_DESCRIPTION_CHARS], he can’t exceed 250 chars without changing the source element. maja advises cloning the Onebox repo and overriding the gem path in Discourse’s Gemfile for local testing. frold confirms this workflow but remains stuck until realizing Amazon’s mobile UA response limits the text. He successfully implements a workaround by targeting #productDescription_fullView and shares a screenshot of the expanded Onebox here. The PR remains unmerged, leaving users without an official fix. hoangviet later asks for help implementing a 500-word limit, indicating ongoing demand for this feature.
After Maja did add a more advance OneBox for Amazon links I would like to know if it is possible to “hack” the OneBox to strip more chars so the Onebox gets bigger.
Eg I see the max chars for description is 200 chars. Where can I change that? Then I could have a larger OneBox - or is it not possible to set how large you want your onebox?
It’s not possible to change the length of the onebox description unfortunately (the only adjustable is internal post onebox).
Amazon onebox uses whatever is displayed as a description excerpt on mobile
Not to maja specific - she did a great job adding the extension to the amazon script, but more generally.
how do I enlarge the onebox for amazon to make a book review section at my site?
Do I need to code a plugin or?
I see this script:
Use these settings:
DEFAULTS = {
EXPAND_ONE_LINER: EXPAND_AFTER | EXPAND_BEFORE, #set how to expand a one liner. user EXPAND_NONE to disable expand
LINES_BEFORE: 10,
LINES_AFTER: 10,
SHOW_LINE_NUMBER: true,
MAX_LINES: 20,
MAX_CHARS: 5000
}
If you want Discourse app to use your cloned onebox, you can replace gem 'onebox', '1.8.42' with gem 'onebox', path: 'path-to-your-cloned-onebox' (run bundle after changing Gemfile)
I even tried this: But Im not able to get more then 250 chars - any one who can push my in the right direction?
Code snippet
require 'json'
module Onebox
module Engine
class AmazonOnebox
include Engine
include LayoutSupport
include HTML
# Set the max number of chars
DEFAULTS = {
MAX_DESCRIPTION_CHARS: 500
}
always_https
matches_regexp(/^https?:\/\/(?:www\.)?(?:smile\.)?(amazon|amzn)\.(?<tld>com|ca|de|it|es|fr|co\.jp|co\.uk|cn|in|com\.br)\//)
def url
if match && match[:id]
return "https://www.amazon.#{tld}/gp/aw/d/#{URI::encode(match[:id])}"
end
@url
end
def tld
@tld || @@matcher.match(@url)["tld"]
end
def http_params
{
'User-Agent' =>
'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3'
}
end
private
def match
@match ||= @url.match(/(?:d|g)p\/(?:product\/)?(?<id>[^\/]+)(?:\/|$)/mi)
end
def image
if (main_image = raw.css("#main-image")) && main_image.any?
attributes = main_image.first.attributes
return attributes["data-a-hires"].to_s if attributes["data-a-hires"]
if attributes["data-a-dynamic-image"]
return ::JSON.parse(attributes["data-a-dynamic-image"].value).keys.first
end
end
if (landing_image = raw.css("#landingImage")) && landing_image.any?
landing_image.first["src"].to_s
end
if (ebook_image = raw.css("#ebooksImgBlkFront")) && ebook_image.any?
::JSON.parse(ebook_image.first.attributes["data-a-dynamic-image"].value).keys.first
end
end
def price
# get item price (Amazon markup is inconsistent, deal with it)
if raw.css("#priceblock_ourprice .restOfPrice")[0] && raw.css("#priceblock_ourprice .restOfPrice")[0].inner_text
"#{raw.css("#priceblock_ourprice .restOfPrice")[0].inner_text}#{raw.css("#priceblock_ourprice .buyingPrice")[0].inner_text}.#{raw.css("#priceblock_ourprice .restOfPrice")[1].inner_text}"
elsif raw.css("#priceblock_dealprice") && (dealprice = raw.css("#priceblock_dealprice span")[0])
dealprice.inner_text
elsif !raw.css("#priceblock_ourprice").inner_text.empty?
raw.css("#priceblock_ourprice").inner_text
else
raw.css(".mediaMatrixListItem.a-active .a-color-price").inner_text
end
end
def multiple_authors(authors_xpath)
author_list = raw.xpath(authors_xpath)
authors = []
author_list.each { |a| authors << a.inner_text.strip }
authors.join(", ")
end
def data
og = ::Onebox::Helpers.extract_opengraph(raw)
if raw.at_css('#dp.book_mobile') #printed books
title = raw.at("h1#title")&.inner_text
authors = raw.at_css('#byline_secondary_view_div') ? multiple_authors("//div[@id='byline_secondary_view_div']//span[@class='a-text-bold']") : raw.at("#byline")&.inner_text
rating = raw.at("#averageCustomerReviews_feature_div .a-icon")&.inner_text || raw.at("#cmrsArcLink .a-icon")&.inner_text
table_xpath = "//div[@id='productDetails_secondary_view_div']//table[@id='productDetails_techSpec_section_1']"
isbn = raw.xpath("#{table_xpath}//tr[8]//td").inner_text.strip
# if ISBN is misplaced or absent it's hard to find out which data is
# available and where to find it so just set it all to nil
if /^\d(\-?\d){12}$/.match(isbn)
publisher = raw.xpath("#{table_xpath}//tr[1]//td").inner_text.strip
published = raw.xpath("#{table_xpath}//tr[2]//td").inner_text.strip
book_length = raw.xpath("#{table_xpath}//tr[6]//td").inner_text.strip
else
isbn = publisher = published = book_length = nil
end
result = {
link: link,
title: title,
by_info: authors,
image: og[:image] || image,
description: raw.at("#productDescription")&.inner_text[0..DEFAULTS[:MAX_DESCRIPTION_CHARS]],
rating: "#{rating}#{', ' if rating && (!isbn&.empty? || !price&.empty?)}",
price: price,
isbn_asin_text: "ISBN",
isbn_asin: isbn,
publisher: publisher,
published: "#{published}#{', ' if published && !price&.empty?}"
}
elsif raw.at_css('#dp.ebooks_mobile') # ebooks
title = raw.at("#ebooksTitle")&.inner_text
authors = raw.at_css('#a-popover-mobile-udp-contributor-popover-id') ? multiple_authors("//div[@id='a-popover-mobile-udp-contributor-popover-id']//span[contains(@class,'a-text-bold')]") : (raw.at("#byline")&.inner_text&.strip || raw.at("#bylineInfo")&.inner_text&.strip)
rating = raw.at("#averageCustomerReviews_feature_div .a-icon")&.inner_text || raw.at("#cmrsArcLink .a-icon")&.inner_text || raw.at("#acrCustomerReviewLink .a-icon")&.inner_text
table_xpath = "//div[@id='detailBullets_secondary_view_div']//ul"
asin = raw.xpath("#{table_xpath}//li[4]/span/span[2]").inner_text
# if ASIN is misplaced or absent it's hard to find out which data is
# available and where to find it so just set it all to nil
if /^[0-9A-Z]{10}$/.match(asin)
publisher = raw.xpath("#{table_xpath}//li[2]/span/span[2]").inner_text
published = raw.xpath("#{table_xpath}//li[1]/span/span[2]").inner_text
else
asin = publisher = published = nil
end
result = {
link: link,
title: title,
by_info: authors,
image: og[:image] || image,
description: raw.at("#productDescription")&.inner_text[0..DEFAULTS[:MAX_DESCRIPTION_CHARS]],
rating: "#{rating}#{', ' if rating && (!asin&.empty? || !price&.empty?)}",
price: price,
isbn_asin_text: "ASIN",
isbn_asin: asin,
publisher: publisher,
published: "#{published}#{', ' if published && !price&.empty?}"
}
else
title = og[:title] || CGI.unescapeHTML(raw.css("title").inner_text)
result = {
link: link,
title: title,
image: og[:image] || image,
price: price
}
result[:by_info] = raw.at("#by-line")
result[:by_info] = Onebox::Helpers.clean(result[:by_info].inner_html) if result[:by_info]
summary = raw.at("#productDescription").inner_text[0..DEFAULTS[:MAX_DESCRIPTION_CHARS]]
result[:description].inner_text[0..DEFAULTS[:MAX_DESCRIPTION_CHARS]] = og[:description].inner_text[0..DEFAULTS[:MAX_DESCRIPTION_CHARS]] || (summary.DEFAULTS[:MAX_DESCRIPTION_CHARS] && summary.inner_text[0..DEFAULTS[:MAX_DESCRIPTION_CHARS]])
end
result
end
end
end
end
Can you guys help me write more specific code on how to increase the number of words described in Onebox?
I have tried several ways, but still cannot increase the number from this description.
I want to increase the number of descriptive words to 500 words for 1 onebox